aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/xterm/charproc.c.X.original
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/xterm/charproc.c.X.original')
-rw-r--r--nx-X11/programs/xterm/charproc.c.X.original7276
1 files changed, 0 insertions, 7276 deletions
diff --git a/nx-X11/programs/xterm/charproc.c.X.original b/nx-X11/programs/xterm/charproc.c.X.original
deleted file mode 100644
index 2c72b5bdc..000000000
--- a/nx-X11/programs/xterm/charproc.c.X.original
+++ /dev/null
@@ -1,7276 +0,0 @@
-/* $XTermId: charproc.c,v 1.627 2005/11/13 23:10:35 tom Exp $ */
-
-/*
- * $Xorg: charproc.c,v 1.6 2001/02/09 02:06:02 xorgcvs Exp $
- */
-
-/* $XFree86: xc/programs/xterm/charproc.c,v 3.177 2005/11/13 23:10:35 dickey Exp $ */
-
-/*
-
-Copyright 1999-2004,2005 by Thomas E. Dickey
-
- All Rights Reserved
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name(s) of the above copyright
-holders shall not be used in advertising or otherwise to promote the
-sale, use or other dealings in this Software without prior written
-authorization.
-
-Copyright 1988 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-*/
-/*
- * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Digital Equipment
- * Corporation not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior permission.
- *
- *
- * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-/* charproc.c */
-
-#include <version.h>
-#include <xterm.h>
-
-#include <X11/Xatom.h>
-#include <X11/Xutil.h>
-#include <X11/cursorfont.h>
-#include <X11/Xmu/Atoms.h>
-#include <X11/Xmu/CharSet.h>
-#include <X11/Xmu/Converters.h>
-
-#if OPT_INPUT_METHOD
-
-#if defined(HAVE_LIB_XAW)
-#include <X11/Xaw/XawImP.h>
-#elif defined(HAVE_LIB_XAW3D)
-#include <X11/Xaw3d/XawImP.h>
-#elif defined(HAVE_LIB_NEXTAW)
-#include <X11/neXtaw/XawImP.h>
-#elif defined(HAVE_LIB_XAWPLUS)
-#include <X11/XawPlus/XawImP.h>
-#endif
-
-#endif
-
-#if OPT_WIDE_CHARS
-#include <wcwidth.h>
-#include <precompose.h>
-#ifdef HAVE_LANGINFO_CODESET
-#include <langinfo.h>
-#endif
-#endif
-
-#if OPT_INPUT_METHOD
-#include <X11/Xlocale.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-
-#if defined(HAVE_SCHED_YIELD)
-#include <sched.h>
-#endif
-
-#include <VTparse.h>
-#include <data.h>
-#include <error.h>
-#include <menu.h>
-#include <main.h>
-#include <fontutils.h>
-#include <xcharmouse.h>
-#include <charclass.h>
-#include <xstrings.h>
-
-#if OPT_ZICONBEEP || OPT_TOOLBAR
-#define HANDLE_STRUCT_NOTIFY 1
-#else
-#define HANDLE_STRUCT_NOTIFY 0
-#endif
-
-static IChar doinput(void);
-static int set_character_class(char *s);
-static void FromAlternate(TScreen * screen);
-static void RequestResize(XtermWidget termw, int rows, int cols, int text);
-static void SwitchBufs(TScreen * screen);
-static void ToAlternate(TScreen * screen);
-static void VTallocbuf(void);
-static void WriteText(TScreen * screen,
- PAIRED_CHARS(Char * str, Char * str2),
- Cardinal len);
-static void ansi_modes(XtermWidget termw,
- void (*func) (unsigned *p, unsigned mask));
-static void bitclr(unsigned *p, unsigned mask);
-static void bitcpy(unsigned *p, unsigned q, unsigned mask);
-static void bitset(unsigned *p, unsigned mask);
-static void dpmodes(XtermWidget termw, void (*func) (unsigned *p, unsigned mask));
-static void restoremodes(XtermWidget termw);
-static void savemodes(XtermWidget termw);
-static void unparseputn(unsigned int n, int fd);
-static void window_ops(XtermWidget termw);
-
-#define DoStartBlinking(s) ((s)->cursor_blink ^ (s)->cursor_blink_esc)
-
-#if OPT_BLINK_CURS || OPT_BLINK_TEXT
-static void HandleBlinking(XtPointer closure, XtIntervalId * id);
-static void StartBlinking(TScreen * screen);
-static void StopBlinking(TScreen * screen);
-#else
-#define StartBlinking(screen) /* nothing */
-#define StopBlinking(screen) /* nothing */
-#endif
-
-#if OPT_INPUT_METHOD
-static void PreeditPosition(TScreen * screen);
-#endif
-
-#define DEFAULT -1
-#define BELLSUPPRESSMSEC 200
-
-static int nparam;
-static ANSI reply;
-static int param[NPARAM];
-
-static jmp_buf vtjmpbuf;
-
-/* event handlers */
-static void HandleBell PROTO_XT_ACTIONS_ARGS;
-static void HandleIgnore PROTO_XT_ACTIONS_ARGS;
-static void HandleKeymapChange PROTO_XT_ACTIONS_ARGS;
-static void HandleVisualBell PROTO_XT_ACTIONS_ARGS;
-#if HANDLE_STRUCT_NOTIFY
-static void HandleStructNotify PROTO_XT_EV_HANDLER_ARGS;
-#endif
-
-/*
- * NOTE: VTInitialize zeros out the entire ".screen" component of the
- * XtermWidget, so make sure to add an assignment statement in VTInitialize()
- * for each new ".screen" field added to this resource list.
- */
-
-/* Defaults */
-#if OPT_ISO_COLORS
-
-/*
- * If we default to colorMode enabled, compile-in defaults for the ANSI colors.
- */
-#if DFT_COLORMODE
-#define DFT_COLOR(name) name
-#else
-#define DFT_COLOR(name) XtDefaultForeground
-#endif
-#endif
-
-static char *_Font_Selected_ = "yes"; /* string is arbitrary */
-
-static char defaultTranslations[] =
-"\
- Shift <KeyPress> Prior:scroll-back(1,halfpage) \n\
- Shift <KeyPress> Next:scroll-forw(1,halfpage) \n\
- Shift <KeyPress> Select:select-cursor-start() select-cursor-end(PRIMARY, CUT_BUFFER0) \n\
- Shift <KeyPress> Insert:insert-selection(PRIMARY, CUT_BUFFER0) \n\
-"
-#if OPT_SHIFT_FONTS
-"\
- Shift~Ctrl <KeyPress> KP_Add:larger-vt-font() \n\
- Shift Ctrl <KeyPress> KP_Add:smaller-vt-font() \n\
- Shift <KeyPress> KP_Subtract:smaller-vt-font() \n\
-"
-#endif
-"\
- ~Meta <KeyPress>:insert-seven-bit() \n\
- Meta <KeyPress>:insert-eight-bit() \n\
- !Ctrl <Btn1Down>:popup-menu(mainMenu) \n\
- !Lock Ctrl <Btn1Down>:popup-menu(mainMenu) \n\
- !Lock Ctrl @Num_Lock <Btn1Down>:popup-menu(mainMenu) \n\
- ! @Num_Lock Ctrl <Btn1Down>:popup-menu(mainMenu) \n\
- ~Meta <Btn1Down>:select-start() \n\
- ~Meta <Btn1Motion>:select-extend() \n\
- !Ctrl <Btn2Down>:popup-menu(vtMenu) \n\
- !Lock Ctrl <Btn2Down>:popup-menu(vtMenu) \n\
- !Lock Ctrl @Num_Lock <Btn2Down>:popup-menu(vtMenu) \n\
- ! @Num_Lock Ctrl <Btn2Down>:popup-menu(vtMenu) \n\
- ~Ctrl ~Meta <Btn2Down>:ignore() \n\
- Meta <Btn2Down>:clear-saved-lines() \n\
- ~Ctrl ~Meta <Btn2Up>:insert-selection(PRIMARY, CUT_BUFFER0) \n\
- !Ctrl <Btn3Down>:popup-menu(fontMenu) \n\
- !Lock Ctrl <Btn3Down>:popup-menu(fontMenu) \n\
- !Lock Ctrl @Num_Lock <Btn3Down>:popup-menu(fontMenu) \n\
- ! @Num_Lock Ctrl <Btn3Down>:popup-menu(fontMenu) \n\
- ~Ctrl ~Meta <Btn3Down>:start-extend() \n\
- ~Meta <Btn3Motion>:select-extend() \n\
- Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\
- Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\
- Lock @Num_Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\
- @Num_Lock Ctrl <Btn4Down>:scroll-back(1,halfpage,m) \n\
- <Btn4Down>:scroll-back(5,line,m) \n\
- Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\
- Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\
- Lock @Num_Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\
- @Num_Lock Ctrl <Btn5Down>:scroll-forw(1,halfpage,m) \n\
- <Btn5Down>:scroll-forw(5,line,m) \n\
- <BtnUp>:select-end(PRIMARY, CUT_BUFFER0) \n\
- <BtnDown>:ignore() \
-"; /* PROCURA added "Meta <Btn2Down>:clear-saved-lines()" */
-/* *INDENT-OFF* */
-static XtActionsRec actionsList[] = {
- { "allow-send-events", HandleAllowSends },
- { "bell", HandleBell },
- { "clear-saved-lines", HandleClearSavedLines },
- { "create-menu", HandleCreateMenu },
- { "dired-button", DiredButton },
- { "hard-reset", HandleHardReset },
- { "ignore", HandleIgnore },
- { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */
- { "insert-eight-bit", HandleEightBitKeyPressed },
- { "insert-selection", HandleInsertSelection },
- { "insert-seven-bit", HandleKeyPressed },
- { "interpret", HandleInterpret },
- { "keymap", HandleKeymapChange },
- { "popup-menu", HandlePopupMenu },
- { "print", HandlePrintScreen },
- { "print-redir", HandlePrintControlMode },
- { "quit", HandleQuit },
- { "redraw", HandleRedraw },
- { "delete-is-del", HandleDeleteIsDEL },
- { "scroll-back", HandleScrollBack },
- { "scroll-forw", HandleScrollForward },
- { "secure", HandleSecure },
- { "select-cursor-end", HandleKeyboardSelectEnd },
- { "select-cursor-extend", HandleKeyboardSelectExtend },
- { "select-cursor-start", HandleKeyboardSelectStart },
- { "select-end", HandleSelectEnd },
- { "select-extend", HandleSelectExtend },
- { "select-set", HandleSelectSet },
- { "select-start", HandleSelectStart },
- { "send-signal", HandleSendSignal },
- { "set-8-bit-control", Handle8BitControl },
- { "set-allow132", HandleAllow132 },
- { "set-altscreen", HandleAltScreen },
- { "set-appcursor", HandleAppCursor },
- { "set-appkeypad", HandleAppKeypad },
- { "set-autolinefeed", HandleAutoLineFeed },
- { "set-autowrap", HandleAutoWrap },
- { "set-backarrow", HandleBackarrow },
- { "set-cursesemul", HandleCursesEmul },
- { "set-jumpscroll", HandleJumpscroll },
- { "set-old-function-keys", HandleOldFunctionKeys },
- { "set-marginbell", HandleMarginBell },
- { "set-reverse-video", HandleReverseVideo },
- { "set-reversewrap", HandleReverseWrap },
- { "set-scroll-on-key", HandleScrollKey },
- { "set-scroll-on-tty-output", HandleScrollTtyOutput },
- { "set-scrollbar", HandleScrollbar },
- { "set-sun-function-keys", HandleSunFunctionKeys },
- { "set-sun-keyboard", HandleSunKeyboard },
- { "set-titeInhibit", HandleTiteInhibit },
- { "set-visual-bell", HandleSetVisualBell },
- { "set-pop-on-bell", HandleSetPopOnBell },
- { "set-vt-font", HandleSetFont },
- { "soft-reset", HandleSoftReset },
- { "start-cursor-extend", HandleKeyboardStartExtend },
- { "start-extend", HandleStartExtend },
- { "string", HandleStringEvent },
- { "vi-button", ViButton },
- { "visual-bell", HandleVisualBell },
-#ifdef ALLOWLOGGING
- { "set-logging", HandleLogging },
-#endif
-#if OPT_BLINK_CURS
- { "set-cursorblink", HandleCursorBlink },
-#endif
-#if OPT_BOX_CHARS
- { "set-font-linedrawing", HandleFontBoxChars },
-#endif
-#if OPT_DABBREV
- { "dabbrev-expand", HandleDabbrevExpand },
-#endif
-#if OPT_DEC_CHRSET
- { "set-font-doublesize", HandleFontDoublesize },
-#endif
-#if OPT_DEC_SOFTFONT
- { "set-font-loading", HandleFontLoading },
-#endif
-#if OPT_HP_FUNC_KEYS
- { "set-hp-function-keys", HandleHpFunctionKeys },
-#endif
-#if OPT_LOAD_VTFONTS
- { "load-vt-fonts", HandleLoadVTFonts },
-#endif
-#if OPT_MAXIMIZE
- { "deiconify", HandleDeIconify },
- { "iconify", HandleIconify },
- { "maximize", HandleMaximize },
- { "restore", HandleRestoreSize },
-#endif
-#if OPT_NUM_LOCK
- { "alt-sends-escape", HandleAltEsc },
- { "meta-sends-escape", HandleMetaEsc },
- { "set-num-lock", HandleNumLock },
-#endif
-#if OPT_READLINE
- { "readline-button", ReadLineButton },
-#endif
-#if OPT_RENDERFONT
- { "set-render-font", HandleRenderFont },
-#endif
-#if OPT_SCO_FUNC_KEYS
- { "set-sco-function-keys", HandleScoFunctionKeys },
-#endif
-#if OPT_SHIFT_FONTS
- { "larger-vt-font", HandleLargerFont },
- { "smaller-vt-font", HandleSmallerFont },
-#endif
-#if OPT_TEK4014
- { "set-terminal-type", HandleSetTerminalType },
- { "set-visibility", HandleVisibility },
- { "set-tek-text", HandleSetTekText },
- { "tek-page", HandleTekPage },
- { "tek-reset", HandleTekReset },
- { "tek-copy", HandleTekCopy },
-#endif
-#if OPT_TOOLBAR
- { "set-toolbar", HandleToolbar },
-#endif
-#if OPT_WIDE_CHARS
- { "set-utf8-mode", HandleUTF8Mode },
-#endif
-};
-/* *INDENT-ON* */
-
-static XtResource resources[] =
-{
- Bres(XtNallowSendEvents, XtCAllowSendEvents, screen.allowSendEvent0, False),
- Bres(XtNallowWindowOps, XtCAllowWindowOps, screen.allowWindowOp0, True),
- Bres(XtNalwaysHighlight, XtCAlwaysHighlight, screen.always_highlight, False),
- Bres(XtNappcursorDefault, XtCAppcursorDefault, misc.appcursorDefault, False),
- Bres(XtNappkeypadDefault, XtCAppkeypadDefault, misc.appkeypadDefault, False),
- Bres(XtNautoWrap, XtCAutoWrap, misc.autoWrap, True),
- Bres(XtNawaitInput, XtCAwaitInput, screen.awaitInput, False),
- Bres(XtNfreeBoldBox, XtCFreeBoldBox, screen.free_bold_box, False),
- Bres(XtNbackarrowKey, XtCBackarrowKey, screen.backarrow_key, True),
- Bres(XtNbellOnReset, XtCBellOnReset, screen.bellOnReset, True),
- Bres(XtNboldMode, XtCBoldMode, screen.bold_mode, True),
- Bres(XtNbrokenSelections, XtCBrokenSelections, screen.brokenSelections, False),
- Bres(XtNc132, XtCC132, screen.c132, False),
- Bres(XtNcurses, XtCCurses, screen.curses, False),
- Bres(XtNcutNewline, XtCCutNewline, screen.cutNewline, True),
- Bres(XtNcutToBeginningOfLine, XtCCutToBeginningOfLine,
- screen.cutToBeginningOfLine, True),
- Bres(XtNdeleteIsDEL, XtCDeleteIsDEL, screen.delete_is_del, DEFDELETE_DEL),
- Bres(XtNdynamicColors, XtCDynamicColors, misc.dynamicColors, True),
- Bres(XtNeightBitControl, XtCEightBitControl, screen.control_eight_bits, False),
- Bres(XtNeightBitInput, XtCEightBitInput, screen.input_eight_bits, True),
- Bres(XtNeightBitOutput, XtCEightBitOutput, screen.output_eight_bits, True),
- Bres(XtNhighlightSelection, XtCHighlightSelection,
- screen.highlight_selection, False),
- Bres(XtNhpLowerleftBugCompat, XtCHpLowerleftBugCompat, screen.hp_ll_bc, False),
- Bres(XtNi18nSelections, XtCI18nSelections, screen.i18nSelections, True),
- Bres(XtNjumpScroll, XtCJumpScroll, screen.jumpscroll, True),
- Bres(XtNloginShell, XtCLoginShell, misc.login_shell, False),
- Bres(XtNmarginBell, XtCMarginBell, screen.marginbell, False),
- Bres(XtNmetaSendsEscape, XtCMetaSendsEscape, screen.meta_sends_esc, False),
- Bres(XtNmultiScroll, XtCMultiScroll, screen.multiscroll, False),
- Bres(XtNoldXtermFKeys, XtCOldXtermFKeys, screen.old_fkeys, False),
- Bres(XtNpopOnBell, XtCPopOnBell, screen.poponbell, False),
- Bres(XtNprinterAutoClose, XtCPrinterAutoClose, screen.printer_autoclose, False),
- Bres(XtNprinterExtent, XtCPrinterExtent, screen.printer_extent, False),
- Bres(XtNprinterFormFeed, XtCPrinterFormFeed, screen.printer_formfeed, False),
- Bres(XtNreverseVideo, XtCReverseVideo, misc.re_verse, False),
- Bres(XtNreverseWrap, XtCReverseWrap, misc.reverseWrap, False),
- Bres(XtNscrollBar, XtCScrollBar, misc.scrollbar, False),
- Bres(XtNscrollKey, XtCScrollCond, screen.scrollkey, False),
- Bres(XtNscrollTtyOutput, XtCScrollCond, screen.scrollttyoutput, True),
- Bres(XtNsignalInhibit, XtCSignalInhibit, misc.signalInhibit, False),
- Bres(XtNtiteInhibit, XtCTiteInhibit, misc.titeInhibit, False),
- Bres(XtNtiXtraScroll, XtCTiXtraScroll, misc.tiXtraScroll, False),
- Bres(XtNtrimSelection, XtCTrimSelection, screen.trim_selection, False),
- Bres(XtNunderLine, XtCUnderLine, screen.underline, True),
- Bres(XtNvisualBell, XtCVisualBell, screen.visualbell, False),
-
- Ires(XtNbellSuppressTime, XtCBellSuppressTime, screen.bellSuppressTime, BELLSUPPRESSMSEC),
- Ires(XtNinternalBorder, XtCBorderWidth, screen.border, DEFBORDER),
- Ires(XtNlimitResize, XtCLimitResize, misc.limit_resize, 1),
- Ires(XtNmultiClickTime, XtCMultiClickTime, screen.multiClickTime, MULTICLICKTIME),
- Ires(XtNnMarginBell, XtCColumn, screen.nmarginbell, N_MARGINBELL),
- Ires(XtNprinterControlMode, XtCPrinterControlMode,
- screen.printer_controlmode, 0),
- Ires(XtNvisualBellDelay, XtCVisualBellDelay, screen.visualBellDelay, 100),
- Ires(XtNsaveLines, XtCSaveLines, screen.savelines, SAVELINES),
- Ires(XtNscrollBarBorder, XtCScrollBarBorder, screen.scrollBarBorder, 1),
- Ires(XtNscrollLines, XtCScrollLines, screen.scrolllines, SCROLLLINES),
-
- Sres(XtNfont1, XtCFont1, screen.MenuFontName(fontMenu_font1), NULL),
- Sres(XtNfont2, XtCFont2, screen.MenuFontName(fontMenu_font2), NULL),
- Sres(XtNfont3, XtCFont3, screen.MenuFontName(fontMenu_font3), NULL),
- Sres(XtNfont4, XtCFont4, screen.MenuFontName(fontMenu_font4), NULL),
- Sres(XtNfont5, XtCFont5, screen.MenuFontName(fontMenu_font5), NULL),
- Sres(XtNfont6, XtCFont6, screen.MenuFontName(fontMenu_font6), NULL),
- Sres(XtNanswerbackString, XtCAnswerbackString, screen.answer_back, ""),
- Sres(XtNboldFont, XtCBoldFont, misc.default_font.f_b, DEFBOLDFONT),
- Sres(XtNcharClass, XtCCharClass, screen.charClass, NULL),
- Sres(XtNdecTerminalID, XtCDecTerminalID, screen.term_id, DFT_DECID),
- Sres(XtNfont, XtCFont, misc.default_font.f_n, DEFFONT),
- Sres(XtNgeometry, XtCGeometry, misc.geo_metry, NULL),
- Sres(XtNkeyboardDialect, XtCKeyboardDialect, screen.keyboard_dialect, DFT_KBD_DIALECT),
- Sres(XtNprinterCommand, XtCPrinterCommand, screen.printer_command, ""),
- Sres(XtNtekGeometry, XtCGeometry, misc.T_geometry, NULL),
-
- Tres(XtNcursorColor, XtCCursorColor, TEXT_CURSOR, XtDefaultForeground),
- Tres(XtNforeground, XtCForeground, TEXT_FG, XtDefaultForeground),
- Tres(XtNpointerColor, XtCPointerColor, MOUSE_FG, XtDefaultForeground),
- Tres(XtNbackground, XtCBackground, TEXT_BG, XtDefaultBackground),
- Tres(XtNpointerColorBackground, XtCBackground, MOUSE_BG, XtDefaultBackground),
-
- {XtNresizeGravity, XtCResizeGravity, XtRGravity, sizeof(XtGravity),
- XtOffsetOf(XtermWidgetRec, misc.resizeGravity),
- XtRImmediate, (XtPointer) SouthWestGravity},
-
- {XtNpointerShape, XtCCursor, XtRCursor, sizeof(Cursor),
- XtOffsetOf(XtermWidgetRec, screen.pointer_cursor),
- XtRString, (XtPointer) "xterm"},
-
-#ifdef ALLOWLOGGING
- Bres(XtNlogInhibit, XtCLogInhibit, misc.logInhibit, False),
- Bres(XtNlogging, XtCLogging, misc.log_on, False),
- Sres(XtNlogFile, XtCLogfile, screen.logfile, NULL),
-#endif
-
-#ifndef NO_ACTIVE_ICON
- Bres("activeIcon", "ActiveIcon", misc.active_icon, False),
- Ires("iconBorderWidth", XtCBorderWidth, misc.icon_border_width, 2),
- Fres("iconFont", "IconFont", screen.fnt_icon, XtDefaultFont),
- Cres("iconBorderColor", XtCBorderColor, misc.icon_border_pixel, XtDefaultBackground),
-#endif /* NO_ACTIVE_ICON */
-
-#if OPT_BLINK_CURS
- Bres(XtNcursorBlink, XtCCursorBlink, screen.cursor_blink, False),
-#endif
-
-#if OPT_BLINK_TEXT
- Bres(XtNshowBlinkAsBold, XtCCursorBlink, screen.blink_as_bold, DEFBLINKASBOLD),
-#endif
-
-#if OPT_BLINK_CURS || OPT_BLINK_TEXT
- Ires(XtNcursorOnTime, XtCCursorOnTime, screen.blink_on, 600),
- Ires(XtNcursorOffTime, XtCCursorOffTime, screen.blink_off, 300),
-#endif
-
-#if OPT_BOX_CHARS
- Bres(XtNforceBoxChars, XtCForceBoxChars, screen.force_box_chars, False),
- Bres(XtNshowMissingGlyphs, XtCShowMissingGlyphs, screen.force_all_chars, False),
-#endif
-
-#if OPT_BROKEN_OSC
- Bres(XtNbrokenLinuxOSC, XtCBrokenLinuxOSC, screen.brokenLinuxOSC, True),
-#endif
-
-#if OPT_BROKEN_ST
- Bres(XtNbrokenStringTerm, XtCBrokenStringTerm, screen.brokenStringTerm, True),
-#endif
-
-#if OPT_C1_PRINT
- Bres(XtNallowC1Printable, XtCAllowC1Printable, screen.c1_printable, False),
-#endif
-
-#if OPT_DEC_CHRSET
- Bres(XtNfontDoublesize, XtCFontDoublesize, screen.font_doublesize, True),
- Ires(XtNcacheDoublesize, XtCCacheDoublesize, screen.cache_doublesize, NUM_CHRSET),
-#endif
-
-#if OPT_HIGHLIGHT_COLOR
- Tres(XtNhighlightColor, XtCHighlightColor, HIGHLIGHT_BG, XtDefaultForeground),
-#endif /* OPT_HIGHLIGHT_COLOR */
-
-#if OPT_INPUT_METHOD
- Bres(XtNopenIm, XtCOpenIm, misc.open_im, True),
- Sres(XtNinputMethod, XtCInputMethod, misc.input_method, NULL),
- Sres(XtNpreeditType, XtCPreeditType, misc.preedit_type,
- "OverTheSpot,Root"),
-#endif
-
-#if OPT_ISO_COLORS
- Bres(XtNboldColors, XtCColorMode, screen.boldColors, True),
- Ires(XtNveryBoldColors, XtCVeryBoldColors, screen.veryBoldColors, 0),
- Bres(XtNcolorMode, XtCColorMode, screen.colorMode, DFT_COLORMODE),
-
- Bres(XtNcolorAttrMode, XtCColorAttrMode, screen.colorAttrMode, False),
- Bres(XtNcolorBDMode, XtCColorAttrMode, screen.colorBDMode, False),
- Bres(XtNcolorBLMode, XtCColorAttrMode, screen.colorBLMode, False),
- Bres(XtNcolorRVMode, XtCColorAttrMode, screen.colorRVMode, False),
- Bres(XtNcolorULMode, XtCColorAttrMode, screen.colorULMode, False),
- Bres(XtNitalicULMode, XtCColorAttrMode, screen.italicULMode, False),
-
- COLOR_RES("0", screen.Acolors[COLOR_0], DFT_COLOR("black")),
- COLOR_RES("1", screen.Acolors[COLOR_1], DFT_COLOR("red3")),
- COLOR_RES("2", screen.Acolors[COLOR_2], DFT_COLOR("green3")),
- COLOR_RES("3", screen.Acolors[COLOR_3], DFT_COLOR("yellow3")),
- COLOR_RES("4", screen.Acolors[COLOR_4], DFT_COLOR(DEF_COLOR4)),
- COLOR_RES("5", screen.Acolors[COLOR_5], DFT_COLOR("magenta3")),
- COLOR_RES("6", screen.Acolors[COLOR_6], DFT_COLOR("cyan3")),
- COLOR_RES("7", screen.Acolors[COLOR_7], DFT_COLOR("gray90")),
- COLOR_RES("8", screen.Acolors[COLOR_8], DFT_COLOR("gray50")),
- COLOR_RES("9", screen.Acolors[COLOR_9], DFT_COLOR("red")),
- COLOR_RES("10", screen.Acolors[COLOR_10], DFT_COLOR("green")),
- COLOR_RES("11", screen.Acolors[COLOR_11], DFT_COLOR("yellow")),
- COLOR_RES("12", screen.Acolors[COLOR_12], DFT_COLOR(DEF_COLOR12)),
- COLOR_RES("13", screen.Acolors[COLOR_13], DFT_COLOR("magenta")),
- COLOR_RES("14", screen.Acolors[COLOR_14], DFT_COLOR("cyan")),
- COLOR_RES("15", screen.Acolors[COLOR_15], DFT_COLOR("white")),
- COLOR_RES("BD", screen.Acolors[COLOR_BD], DFT_COLOR(XtDefaultForeground)),
- COLOR_RES("BL", screen.Acolors[COLOR_BL], DFT_COLOR(XtDefaultForeground)),
- COLOR_RES("UL", screen.Acolors[COLOR_UL], DFT_COLOR(XtDefaultForeground)),
- COLOR_RES("RV", screen.Acolors[COLOR_RV], DFT_COLOR(XtDefaultForeground)),
-
-#if !OPT_COLOR_RES2
-#if OPT_256_COLORS
-# include <256colres.h>
-#elif OPT_88_COLORS
-# include <88colres.h>
-#endif
-#endif /* !OPT_COLOR_RES2 */
-
-#endif /* OPT_ISO_COLORS */
-
-#if OPT_MOD_FKEYS
- Ires(XtNmodifyCursorKeys, XtCModifyCursorKeys,
- keyboard.modify_cursor_keys, 2),
-#endif
-
-#if OPT_NUM_LOCK
- Bres(XtNalwaysUseMods, XtCAlwaysUseMods, misc.alwaysUseMods, False),
- Bres(XtNnumLock, XtCNumLock, misc.real_NumLock, True),
-#endif
-
-#if OPT_PRINT_COLORS
- Ires(XtNprintAttributes, XtCPrintAttributes, screen.print_attributes, 1),
-#endif
-
-#if OPT_SHIFT_FONTS
- Bres(XtNshiftFonts, XtCShiftFonts, misc.shift_fonts, True),
-#endif
-
-#if OPT_SUNPC_KBD
- Ires(XtNctrlFKeys, XtCCtrlFKeys, misc.ctrl_fkeys, 10),
-#endif
-
-#if OPT_TEK4014
- Bres(XtNtekInhibit, XtCTekInhibit, misc.tekInhibit, False),
- Bres(XtNtekSmall, XtCTekSmall, misc.tekSmall, False),
- Bres(XtNtekStartup, XtCTekStartup, screen.TekEmu, False),
-#endif
-
-#if OPT_TOOLBAR
- Wres(XtNmenuBar, XtCMenuBar, VT100_TB_INFO(menu_bar), 0),
- Ires(XtNmenuHeight, XtCMenuHeight, VT100_TB_INFO(menu_height), 25),
-#endif
-
-#if OPT_WIDE_CHARS
- Ires(XtNutf8, XtCUtf8, screen.utf8_mode, uDefault),
- Bres(XtNwideChars, XtCWideChars, screen.wide_chars, False),
- Bres(XtNmkWidth, XtCMkWidth, misc.mk_width, False),
- Bres(XtNcjkWidth, XtCCjkWidth, misc.cjk_width, False),
- Bres(XtNvt100Graphics, XtCVT100Graphics, screen.vt100_graphics, True),
- Sres(XtNwideBoldFont, XtCWideBoldFont, misc.default_font.f_wb, DEFWIDEBOLDFONT),
- Sres(XtNwideFont, XtCWideFont, misc.default_font.f_w, DEFWIDEFONT),
-#endif
-
-#if OPT_LUIT_PROG
- Sres(XtNlocale, XtCLocale, misc.locale_str, "medium"),
- Sres(XtNlocaleFilter, XtCLocaleFilter, misc.localefilter, DEFLOCALEFILTER),
-#endif
-
-#if OPT_INPUT_METHOD
- Sres(XtNximFont, XtCXimFont, misc.f_x, DEFXIMFONT),
-#endif
-
-#if OPT_XMC_GLITCH
- Bres(XtNxmcInline, XtCXmcInline, screen.xmc_inline, False),
- Bres(XtNxmcMoveSGR, XtCXmcMoveSGR, screen.move_sgr_ok, True),
- Ires(XtNxmcAttributes, XtCXmcAttributes, screen.xmc_attributes, 1),
- Ires(XtNxmcGlitch, XtCXmcGlitch, screen.xmc_glitch, 0),
-#endif
-
-#ifdef SCROLLBAR_RIGHT
- Bres(XtNrightScrollBar, XtCRightScrollBar, misc.useRight, False),
-#endif
-
-#if OPT_RENDERFONT
- Dres(XtNfaceSize, XtCFaceSize, misc.face_size, DEFFACESIZE),
- Sres(XtNfaceName, XtCFaceName, misc.face_name, DEFFACENAME),
- Sres(XtNfaceNameDoublesize, XtCFaceNameDoublesize, misc.face_wide_name, DEFFACENAME),
- Bres(XtNrenderFont, XtCRenderFont, misc.render_font, True),
-#endif
-};
-
-static Boolean VTSetValues(Widget cur, Widget request, Widget new_arg,
- ArgList args, Cardinal *num_args);
-static void VTClassInit(void);
-static void VTDestroy(Widget w);
-static void VTExpose(Widget w, XEvent * event, Region region);
-static void VTInitialize(Widget wrequest, Widget new_arg, ArgList args,
- Cardinal *num_args);
-static void VTRealize(Widget w, XtValueMask * valuemask,
- XSetWindowAttributes * values);
-static void VTResize(Widget w);
-
-#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD
-static void VTInitI18N(void);
-#endif
-
-#ifdef VMS
-globaldef {
- "xtermclassrec"
-} noshare
-
-#else
-static
-#endif /* VMS */
-WidgetClassRec xtermClassRec =
-{
- {
-/* core_class fields */
- (WidgetClass) & widgetClassRec, /* superclass */
- "VT100", /* class_name */
- sizeof(XtermWidgetRec), /* widget_size */
- VTClassInit, /* class_initialize */
- NULL, /* class_part_initialize */
- False, /* class_inited */
- VTInitialize, /* initialize */
- NULL, /* initialize_hook */
- VTRealize, /* realize */
- actionsList, /* actions */
- XtNumber(actionsList), /* num_actions */
- resources, /* resources */
- XtNumber(resources), /* num_resources */
- NULLQUARK, /* xrm_class */
- True, /* compress_motion */
- False, /* compress_exposure */
- True, /* compress_enterleave */
- False, /* visible_interest */
- VTDestroy, /* destroy */
- VTResize, /* resize */
- VTExpose, /* expose */
- VTSetValues, /* set_values */
- NULL, /* set_values_hook */
- XtInheritSetValuesAlmost, /* set_values_almost */
- NULL, /* get_values_hook */
- NULL, /* accept_focus */
- XtVersion, /* version */
- NULL, /* callback_offsets */
- defaultTranslations, /* tm_table */
- XtInheritQueryGeometry, /* query_geometry */
- XtInheritDisplayAccelerator, /* display_accelerator */
- NULL /* extension */
- }
-};
-
-#ifdef VMS
-globaldef {
- "xtermwidgetclass"
-}
-noshare
-#endif /* VMS */
-WidgetClass xtermWidgetClass = (WidgetClass) & xtermClassRec;
-
-/*
- * Add input-actions for widgets that are overlooked (scrollbar and toolbar):
- *
- * a) Sometimes the scrollbar passes through translations, sometimes it
- * doesn't. We add the KeyPress translations here, just to be sure.
- * b) In the normal (non-toolbar) configuration, the xterm widget covers
- * almost all of the window. With a toolbar, there's a relatively
- * large area that the user would expect to enter keystrokes since the
- * program can get the focus.
- */
-void
-xtermAddInput(Widget w)
-{
-#if OPT_TOOLBAR
- /* *INDENT-OFF* */
- XtActionsRec input_actions[] = {
- { "insert", HandleKeyPressed }, /* alias */
- { "insert-eight-bit", HandleEightBitKeyPressed },
- { "insert-seven-bit", HandleKeyPressed },
- { "secure", HandleSecure },
- { "string", HandleStringEvent },
- { "scroll-back", HandleScrollBack },
- { "scroll-forw", HandleScrollForward },
- { "select-cursor-end", HandleKeyboardSelectEnd },
- { "select-cursor-extend", HandleKeyboardSelectExtend },
- { "select-cursor-start", HandleKeyboardSelectStart },
- { "insert-selection", HandleInsertSelection },
- { "select-start", HandleSelectStart },
- { "select-extend", HandleSelectExtend },
- { "start-extend", HandleStartExtend },
- { "select-end", HandleSelectEnd },
- { "clear-saved-lines", HandleClearSavedLines },
- { "popup-menu", HandlePopupMenu },
- { "bell", HandleBell },
- { "ignore", HandleIgnore },
-#if OPT_DABBREV
- { "dabbrev-expand", HandleDabbrevExpand },
-#endif
-#if OPT_SHIFT_FONTS
- { "larger-vt-font", HandleLargerFont },
- { "smaller-vt-font", HandleSmallerFont },
-#endif
- };
- /* *INDENT-ON* */
-
- XtAppAddActions(app_con, input_actions, XtNumber(input_actions));
-#endif
- XtAugmentTranslations(w, XtParseTranslationTable(defaultTranslations));
-}
-
-#if OPT_ISO_COLORS
-/*
- * The terminal's foreground and background colors are set via two mechanisms:
- * text (cur_foreground, cur_background values that are passed down to
- * XDrawImageString and XDrawString)
- * area (X11 graphics context used in XClearArea and XFillRectangle)
- */
-void
-SGR_Foreground(int color)
-{
- TScreen *screen = &term->screen;
- Pixel fg;
-
- if (color >= 0) {
- term->flags |= FG_COLOR;
- } else {
- term->flags &= ~FG_COLOR;
- }
- fg = getXtermForeground(term->flags, color);
- term->cur_foreground = color;
-
- XSetForeground(screen->display, NormalGC(screen), fg);
- XSetBackground(screen->display, ReverseGC(screen), fg);
-
- if (NormalGC(screen) != NormalBoldGC(screen)) {
- XSetForeground(screen->display, NormalBoldGC(screen), fg);
- XSetBackground(screen->display, ReverseBoldGC(screen), fg);
- }
-}
-
-void
-SGR_Background(int color)
-{
- TScreen *screen = &term->screen;
- Pixel bg;
-
- /*
- * An indexing operation may have set screen->scroll_amt, which would
- * normally result in calling FlushScroll() in WriteText(). However,
- * if we're changing the background color now, then the new value
- * should not apply to the pending blank lines.
- */
- if (screen->scroll_amt && (color != term->cur_background))
- FlushScroll(screen);
-
- if (color >= 0) {
- term->flags |= BG_COLOR;
- } else {
- term->flags &= ~BG_COLOR;
- }
- bg = getXtermBackground(term->flags, color);
- term->cur_background = color;
-
- XSetBackground(screen->display, NormalGC(screen), bg);
- XSetForeground(screen->display, ReverseGC(screen), bg);
-
- if (NormalGC(screen) != NormalBoldGC(screen)) {
- XSetBackground(screen->display, NormalBoldGC(screen), bg);
- XSetForeground(screen->display, ReverseBoldGC(screen), bg);
- }
-}
-
-/* Invoked after updating bold/underline flags, computes the extended color
- * index to use for foreground. (See also 'extract_fg()').
- */
-static void
-setExtendedFG(void)
-{
- int fg = term->sgr_foreground;
-
- if (term->screen.colorAttrMode
- || (fg < 0)) {
- if (term->screen.colorULMode && (term->flags & UNDERLINE))
- fg = COLOR_UL;
- if (term->screen.colorBDMode && (term->flags & BOLD))
- fg = COLOR_BD;
- if (term->screen.colorBLMode && (term->flags & BLINK))
- fg = COLOR_BL;
- }
-
- /* This implements the IBM PC-style convention of 8-colors, with one
- * bit for bold, thus mapping the 0-7 codes to 8-15. It won't make
- * much sense for 16-color applications, but we keep it to retain
- * compatiblity with ANSI-color applications.
- */
-#if OPT_PC_COLORS /* XXXJTL should be settable at runtime (resource or OSC?) */
- if (term->screen.boldColors
- && (!term->sgr_extended)
- && (fg >= 0)
- && (fg < 8)
- && (term->flags & BOLD))
- fg |= 8;
-#endif
-
- SGR_Foreground(fg);
-}
-
-/* Invoked after updating inverse flag, computes the extended color
- * index to use for background. (See also 'extract_bg()').
- */
-static void
-setExtendedBG(void)
-{
- int bg = term->sgr_background;
-
- if (term->screen.colorAttrMode
- || (bg < 0)) {
- if (term->screen.colorRVMode && (term->flags & INVERSE))
- bg = COLOR_RV;
- }
-
- SGR_Background(bg);
-}
-
-static void
-reset_SGR_Foreground(void)
-{
- term->sgr_foreground = -1;
- term->sgr_extended = 0;
- setExtendedFG();
-}
-
-static void
-reset_SGR_Background(void)
-{
- term->sgr_background = -1;
- setExtendedBG();
-}
-
-static void
-reset_SGR_Colors(void)
-{
- reset_SGR_Foreground();
- reset_SGR_Background();
-}
-#endif /* OPT_ISO_COLORS */
-
-void
-resetCharsets(TScreen * screen)
-{
- TRACE(("resetCharsets\n"));
-
- screen->gsets[0] = 'B'; /* ASCII_G */
- screen->gsets[1] = 'B'; /* ASCII_G */
- screen->gsets[2] = 'B'; /* ASCII_G */
- screen->gsets[3] = 'B'; /* ASCII_G */
-
- screen->curgl = 0; /* G0 => GL. */
- screen->curgr = 2; /* G2 => GR. */
- screen->curss = 0; /* No single shift. */
-
-#if OPT_VT52_MODE
- if (screen->vtXX_level == 0)
- screen->gsets[1] = '0'; /* Graphics */
-#endif
-}
-
-/*
- * VT300 and up support three ANSI conformance levels, defined according to
- * the dpANSI X3.134.1 standard. DEC's manuals equate levels 1 and 2, and
- * are unclear. This code is written based on the manuals.
- */
-static void
-set_ansi_conformance(TScreen * screen, int level)
-{
- TRACE(("set_ansi_conformance(%d) terminal_id %d, ansi_level %d\n",
- level,
- screen->terminal_id,
- screen->ansi_level));
- if (screen->vtXX_level >= 3) {
- switch (screen->ansi_level = level) {
- case 1:
- /* FALLTHRU */
- case 2:
- screen->gsets[0] = 'B'; /* G0 is ASCII */
- screen->gsets[1] = 'B'; /* G1 is ISO Latin-1 (FIXME) */
- screen->curgl = 0;
- screen->curgr = 1;
- break;
- case 3:
- screen->gsets[0] = 'B'; /* G0 is ASCII */
- screen->curgl = 0;
- break;
- }
- }
-}
-
-/*
- * Set scrolling margins. VTxxx terminals require that the top/bottom are
- * different, so we have at least two lines in the scrolling region.
- */
-void
-set_tb_margins(TScreen * screen, int top, int bottom)
-{
- TRACE(("set_tb_margins %d..%d, prior %d..%d\n",
- top, bottom,
- screen->top_marg,
- screen->bot_marg));
- if (bottom > top) {
- screen->top_marg = top;
- screen->bot_marg = bottom;
- }
- if (screen->top_marg > screen->max_row)
- screen->top_marg = screen->max_row;
- if (screen->bot_marg > screen->max_row)
- screen->bot_marg = screen->max_row;
-}
-
-void
-set_max_col(TScreen * screen, int cols)
-{
- TRACE(("set_max_col %d, prior %d\n", cols, screen->max_col));
- if (cols < 0)
- cols = 0;
- screen->max_col = cols;
-}
-
-void
-set_max_row(TScreen * screen, int rows)
-{
- TRACE(("set_max_row %d, prior %d\n", rows, screen->max_row));
- if (rows < 0)
- rows = 0;
- screen->max_row = rows;
-}
-
-#if OPT_TRACE
-#define WHICH_TABLE(name) if (table == name) result = #name
-static char *
-which_table(Const PARSE_T * table)
-{
- char *result = "?";
- /* *INDENT-OFF* */
- WHICH_TABLE (ansi_table);
- else WHICH_TABLE (csi_table);
- else WHICH_TABLE (csi2_table);
- else WHICH_TABLE (csi_ex_table);
- else WHICH_TABLE (csi_quo_table);
-#if OPT_DEC_LOCATOR
- else WHICH_TABLE (csi_tick_table);
-#endif
-#if OPT_DEC_RECTOPS
- else WHICH_TABLE (csi_dollar_table);
- else WHICH_TABLE (csi_star_table);
-#endif
- else WHICH_TABLE (dec_table);
- else WHICH_TABLE (dec2_table);
- else WHICH_TABLE (dec3_table);
- else WHICH_TABLE (cigtable);
- else WHICH_TABLE (eigtable);
- else WHICH_TABLE (esc_table);
- else WHICH_TABLE (esc_sp_table);
- else WHICH_TABLE (scrtable);
- else WHICH_TABLE (scstable);
- else WHICH_TABLE (sos_table);
-#if OPT_WIDE_CHARS
- else WHICH_TABLE (esc_pct_table);
-#endif
-#if OPT_VT52_MODE
- else WHICH_TABLE (vt52_table);
- else WHICH_TABLE (vt52_esc_table);
- else WHICH_TABLE (vt52_ignore_table);
-#endif
- /* *INDENT-ON* */
-
- return result;
-}
-#endif
-
- /* allocate larger buffer if needed/possible */
-#define SafeAlloc(type, area, used, size) \
- type *new_string = area; \
- unsigned new_length = size; \
- if (new_length == 0) { \
- new_length = 256; \
- new_string = TypeMallocN(type, new_length); \
- } else if (used+1 >= new_length) { \
- new_length = size * 2; \
- new_string = TypeMallocN(type, new_length); \
- if (new_string != 0 \
- && area != 0 \
- && used != 0) \
- memcpy(new_string, area, used * sizeof(type)); \
- }
-
-#define WriteNow() { \
- unsigned single = 0; \
- \
- if (screen->curss) { \
- dotext(screen, \
- screen->gsets[(int) (screen->curss)], \
- print_area, 1); \
- screen->curss = 0; \
- single++; \
- } \
- if (print_used > single) { \
- dotext(screen, \
- screen->gsets[(int) (screen->curgl)], \
- print_area + single, \
- print_used - single); \
- } \
- print_used = 0; \
- } \
-
-struct ParseState {
-#if OPT_VT52_MODE
- Bool vt52_cup;
-#endif
- Const PARSE_T *groundtable;
- Const PARSE_T *parsestate;
- int scstype;
- Bool private_function; /* distinguish private-mode from standard */
- int string_mode; /* nonzero iff we're processing a string */
- int lastchar; /* positive iff we had a graphic character */
- int nextstate;
-#if OPT_WIDE_CHARS
- int last_was_wide;
-#endif
-};
-
-static struct ParseState myState;
-
-static Boolean
-doparsing(unsigned c, struct ParseState *sp)
-{
- /* Buffer for processing printable text */
- static IChar *print_area;
- static size_t print_size, print_used;
-
- /* Buffer for processing strings (e.g., OSC ... ST) */
- static Char *string_area;
- static size_t string_size, string_used;
-
- TScreen *screen = &term->screen;
- int row;
- int col;
- int top;
- int bot;
- int count;
- int laststate;
- int thischar = -1;
- XTermRect myRect;
-
- do {
-#if OPT_WIDE_CHARS
-
- /*
- * Handle zero-width combining characters. Make it faster by noting
- * that according to the Unicode charts, the majority of Western
- * character sets do not use this feature. There are some unassigned
- * codes at 0x242, but no zero-width characters until past 0x300.
- */
- if (c >= 0x300 && screen->wide_chars
- && my_wcwidth((int) c) == 0) {
- int prev, precomposed;
-
- WriteNow();
-
- prev = getXtermCell(screen,
- screen->last_written_row,
- screen->last_written_col);
- precomposed = do_precomposition(prev, (int) c);
-
- if (precomposed != -1) {
- putXtermCell(screen,
- screen->last_written_row,
- screen->last_written_col, precomposed);
- } else {
- addXtermCombining(screen,
- screen->last_written_row,
- screen->last_written_col, c);
- }
- if (!screen->scroll_amt)
- ScrnUpdate(screen,
- screen->last_written_row,
- screen->last_written_col, 1, 1, 1);
- continue;
- }
-#endif
-
- /* Intercept characters for printer controller mode */
- if (screen->printer_controlmode == 2) {
- if ((c = xtermPrinterControl((int) c)) == 0)
- continue;
- }
-
- /*
- * VT52 is a little ugly in the one place it has a parameterized
- * control sequence, since the parameter falls after the character
- * that denotes the type of sequence.
- */
-#if OPT_VT52_MODE
- if (sp->vt52_cup) {
- if (nparam < NPARAM)
- param[nparam++] = (c & 0x7f) - 32;
- if (nparam < 2)
- continue;
- sp->vt52_cup = False;
- if ((row = param[0]) < 0)
- row = 0;
- if ((col = param[1]) < 0)
- col = 0;
- CursorSet(screen, row, col, term->flags);
- sp->parsestate = vt52_table;
- param[0] = 0;
- param[1] = 0;
- continue;
- }
-#endif
-
- /*
- * The parsing tables all have 256 entries. If we're supporting
- * wide characters, we handle them by treating them the same as
- * printing characters.
- */
- laststate = sp->nextstate;
-#if OPT_WIDE_CHARS
- if (c > 255) {
- if (sp->parsestate == sp->groundtable) {
- sp->nextstate = CASE_PRINT;
- } else if (sp->parsestate == sos_table) {
- c &= 0xffff;
- if (c > 255) {
- TRACE(("Found code > 255 while in SOS state: %04X\n", c));
- c = '?';
- }
- } else {
- sp->nextstate = CASE_GROUND_STATE;
- }
- } else
-#endif
- sp->nextstate = sp->parsestate[E2A(c)];
-
-#if OPT_BROKEN_OSC
- /*
- * Linux console palette escape sequences start with an OSC, but do
- * not terminate correctly. Some scripts do not check before writing
- * them, making xterm appear to hang (it's awaiting a valid string
- * terminator). Just ignore these if we see them - there's no point
- * in emulating bad code.
- */
- if (screen->brokenLinuxOSC
- && sp->parsestate == sos_table) {
- if (string_used) {
- switch (string_area[0]) {
- case 'P':
- if (string_used <= 7)
- break;
- /* FALLTHRU */
- case 'R':
- sp->parsestate = sp->groundtable;
- sp->nextstate = sp->parsestate[E2A(c)];
- TRACE(("Reset to ground state (brokenLinuxOSC)\n"));
- break;
- }
- }
- }
-#endif
-
-#if OPT_BROKEN_ST
- /*
- * Before patch #171, carriage control embedded within an OSC string
- * would terminate it. Some (buggy, of course) applications rely on
- * this behavior. Accommodate them by allowing one to compile xterm
- * and emulate the old behavior.
- */
- if (screen->brokenStringTerm
- && sp->parsestate == sos_table
- && c < 32) {
- switch (c) {
- case 5: /* FALLTHRU */
- case 8: /* FALLTHRU */
- case 9: /* FALLTHRU */
- case 10: /* FALLTHRU */
- case 11: /* FALLTHRU */
- case 12: /* FALLTHRU */
- case 13: /* FALLTHRU */
- case 14: /* FALLTHRU */
- case 15: /* FALLTHRU */
- case 24:
- sp->parsestate = sp->groundtable;
- sp->nextstate = sp->parsestate[E2A(c)];
- TRACE(("Reset to ground state (brokenStringTerm)\n"));
- break;
- }
- }
-#endif
-
-#if OPT_C1_PRINT
- /*
- * This is not completely foolproof, but will allow an application
- * with values in the C1 range to use them as printable characters,
- * provided that they are not intermixed with an escape sequence.
- */
- if (screen->c1_printable
- && (c >= 128 && c < 160)) {
- sp->nextstate = (sp->parsestate == esc_table
- ? CASE_ESC_IGNORE
- : sp->parsestate[E2A(160)]);
- }
-#endif
-
-#if OPT_WIDE_CHARS
- /*
- * If we have a C1 code and the c1_printable flag is not set, simply
- * ignore it when it was translated from UTF-8. That is because the
- * value could not have been present as-is in the UTF-8.
- *
- * To see that CASE_IGNORE is a consistent value, note that it is
- * always used for NUL and other uninteresting C0 controls.
- */
-#if OPT_C1_PRINT
- if (!screen->c1_printable)
-#endif
- if (screen->wide_chars
- && (c >= 128 && c < 160)) {
- sp->nextstate = CASE_IGNORE;
- }
-
- /*
- * If this character is a different width than the last one, put the
- * previous text into the buffer and draw it now.
- */
- if (iswide((int) c) != sp->last_was_wide) {
- WriteNow();
- }
-#endif
-
- /*
- * Accumulate string for printable text. This may be 8/16-bit
- * characters.
- */
- if (sp->nextstate == CASE_PRINT) {
- SafeAlloc(IChar, print_area, print_used, print_size);
- if (new_string == 0) {
- fprintf(stderr,
- "Cannot allocate %u bytes for printable text\n",
- new_length);
- continue;
- }
-#if OPT_VT52_MODE
- /*
- * Strip output text to 7-bits for VT52. We should do this for
- * VT100 also (which is a 7-bit device), but xterm has been
- * doing this for so long we shouldn't change this behavior.
- */
- if (screen->vtXX_level < 1)
- c &= 0x7f;
-#endif
- print_area = new_string;
- print_size = new_length;
- print_area[print_used++] = sp->lastchar = thischar = c;
-#if OPT_WIDE_CHARS
- sp->last_was_wide = iswide((int) c);
-#endif
- if (morePtyData(screen, VTbuffer)) {
- continue;
- }
- }
-
- if (sp->nextstate == CASE_PRINT
- || (laststate == CASE_PRINT && print_used)) {
- WriteNow();
- }
-
- /*
- * Accumulate string for APC, DCS, PM, OSC, SOS controls
- * This should always be 8-bit characters.
- */
- if (sp->parsestate == sos_table) {
- SafeAlloc(Char, string_area, string_used, string_size);
- if (new_string == 0) {
- fprintf(stderr,
- "Cannot allocate %u bytes for string mode %d\n",
- new_length, sp->string_mode);
- continue;
- }
-#if OPT_WIDE_CHARS
- /*
- * We cannot display codes above 255, but let's try to
- * accommodate the application a little by not aborting the
- * string.
- */
- if ((c & 0xffff) > 255) {
- sp->nextstate = CASE_PRINT;
- c = '?';
- }
-#endif
- string_area = new_string;
- string_size = new_length;
- string_area[string_used++] = c;
- } else if (sp->parsestate != esc_table) {
- /* if we were accumulating, we're not any more */
- sp->string_mode = 0;
- string_used = 0;
- }
-
- TRACE(("parse %04X -> %d %s\n", c, sp->nextstate, which_table(sp->parsestate)));
-
- switch (sp->nextstate) {
- case CASE_PRINT:
- TRACE(("CASE_PRINT - printable characters\n"));
- break;
-
- case CASE_GROUND_STATE:
- TRACE(("CASE_GROUND_STATE - exit ignore mode\n"));
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_IGNORE:
- TRACE(("CASE_IGNORE - Ignore character %02X\n", c));
- break;
-
- case CASE_ENQ:
- TRACE(("CASE_ENQ - answerback\n"));
- for (count = 0; screen->answer_back[count] != 0; count++)
- unparseputc(screen->answer_back[count], screen->respond);
- break;
-
- case CASE_BELL:
- TRACE(("CASE_BELL - bell\n"));
- if (sp->string_mode == OSC) {
- if (string_used)
- string_area[--string_used] = '\0';
- do_osc(string_area, string_used, (int) c);
- sp->parsestate = sp->groundtable;
- } else {
- /* bell */
- Bell(XkbBI_TerminalBell, 0);
- }
- break;
-
- case CASE_BS:
- TRACE(("CASE_BS - backspace\n"));
- CursorBack(screen, 1);
- break;
-
- case CASE_CR:
- /* CR */
- CarriageReturn(screen);
- break;
-
- case CASE_ESC:
- if_OPT_VT52_MODE(screen, {
- sp->parsestate = vt52_esc_table;
- break;
- });
- sp->parsestate = esc_table;
- break;
-
-#if OPT_VT52_MODE
- case CASE_VT52_CUP:
- TRACE(("CASE_VT52_CUP - VT52 cursor addressing\n"));
- sp->vt52_cup = True;
- nparam = 0;
- break;
-
- case CASE_VT52_IGNORE:
- TRACE(("CASE_VT52_IGNORE - VT52 ignore-character\n"));
- sp->parsestate = vt52_ignore_table;
- break;
-#endif
-
- case CASE_VMOT:
- /*
- * form feed, line feed, vertical tab
- */
- xtermAutoPrint((int) c);
- xtermIndex(screen, 1);
- if (term->flags & LINEFEED)
- CarriageReturn(screen);
- do_xevents();
- break;
-
- case CASE_CBT:
- /* cursor backward tabulation */
- if ((count = param[0]) == DEFAULT)
- count = 1;
- while ((count-- > 0)
- && (TabToPrevStop(screen))) ;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CHT:
- /* cursor forward tabulation */
- if ((count = param[0]) == DEFAULT)
- count = 1;
- while ((count-- > 0)
- && (TabToNextStop(screen))) ;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_TAB:
- /* tab */
- TabToNextStop(screen);
- break;
-
- case CASE_SI:
- screen->curgl = 0;
- if_OPT_VT52_MODE(screen, {
- sp->parsestate = sp->groundtable;
- });
- break;
-
- case CASE_SO:
- screen->curgl = 1;
- if_OPT_VT52_MODE(screen, {
- sp->parsestate = sp->groundtable;
- });
- break;
-
- case CASE_DECDHL:
- xterm_DECDHL(c == '3');
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSWL:
- xterm_DECSWL();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECDWL:
- xterm_DECDWL();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SCR_STATE:
- /* enter scr state */
- sp->parsestate = scrtable;
- break;
-
- case CASE_SCS0_STATE:
- /* enter scs state 0 */
- sp->scstype = 0;
- sp->parsestate = scstable;
- break;
-
- case CASE_SCS1_STATE:
- /* enter scs state 1 */
- sp->scstype = 1;
- sp->parsestate = scstable;
- break;
-
- case CASE_SCS2_STATE:
- /* enter scs state 2 */
- sp->scstype = 2;
- sp->parsestate = scstable;
- break;
-
- case CASE_SCS3_STATE:
- /* enter scs state 3 */
- sp->scstype = 3;
- sp->parsestate = scstable;
- break;
-
- case CASE_ESC_IGNORE:
- /* unknown escape sequence */
- sp->parsestate = eigtable;
- break;
-
- case CASE_ESC_DIGIT:
- /* digit in csi or dec mode */
- if ((row = param[nparam - 1]) == DEFAULT)
- row = 0;
- param[nparam - 1] = 10 * row + (c - '0');
- if (param[nparam - 1] > 65535)
- param[nparam - 1] = 65535;
- if (sp->parsestate == csi_table)
- sp->parsestate = csi2_table;
- break;
-
- case CASE_ESC_SEMI:
- /* semicolon in csi or dec mode */
- if (nparam < NPARAM)
- param[nparam++] = DEFAULT;
- if (sp->parsestate == csi_table)
- sp->parsestate = csi2_table;
- break;
-
- case CASE_DEC_STATE:
- /* enter dec mode */
- sp->parsestate = dec_table;
- break;
-
- case CASE_DEC2_STATE:
- /* enter dec2 mode */
- sp->parsestate = dec2_table;
- break;
-
- case CASE_DEC3_STATE:
- /* enter dec3 mode */
- sp->parsestate = dec3_table;
- break;
-
- case CASE_ICH:
- TRACE(("CASE_ICH - insert char\n"));
- if ((row = param[0]) < 1)
- row = 1;
- InsertChar(screen, (unsigned) row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CUU:
- TRACE(("CASE_CUU - cursor up\n"));
- if ((row = param[0]) < 1)
- row = 1;
- CursorUp(screen, row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CUD:
- TRACE(("CASE_CUD - cursor down\n"));
- if ((row = param[0]) < 1)
- row = 1;
- CursorDown(screen, row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CUF:
- TRACE(("CASE_CUF - cursor forward\n"));
- if ((col = param[0]) < 1)
- col = 1;
- CursorForward(screen, col);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CUB:
- TRACE(("CASE_CUB - cursor backward\n"));
- if ((col = param[0]) < 1)
- col = 1;
- CursorBack(screen, col);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CUP:
- TRACE(("CASE_CUP - cursor position\n"));
- if_OPT_XMC_GLITCH(screen, {
- Jump_XMC(screen);
- });
- if ((row = param[0]) < 1)
- row = 1;
- if (nparam < 2 || (col = param[1]) < 1)
- col = 1;
- CursorSet(screen, row - 1, col - 1, term->flags);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_VPA:
- TRACE(("CASE_VPA - vertical position\n"));
- if ((row = param[0]) < 1)
- row = 1;
- CursorSet(screen, row - 1, screen->cur_col, term->flags);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_HPA:
- TRACE(("CASE_HPA - horizontal position\n"));
- if ((col = param[0]) < 1)
- col = 1;
- CursorSet(screen, screen->cur_row, col - 1, term->flags);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_HP_BUGGY_LL:
- TRACE(("CASE_HP_BUGGY_LL\n"));
- /* Some HP-UX applications have the bug that they
- assume ESC F goes to the lower left corner of
- the screen, regardless of what terminfo says. */
- if (screen->hp_ll_bc)
- CursorSet(screen, screen->max_row, 0, term->flags);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_ED:
- TRACE(("CASE_ED - erase display\n"));
- do_erase_display(screen, param[0], OFF_PROTECT);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_EL:
- TRACE(("CASE_EL - erase line\n"));
- do_erase_line(screen, param[0], OFF_PROTECT);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_ECH:
- TRACE(("CASE_ECH - erase char\n"));
- /* ECH */
- ClearRight(screen, param[0] < 1 ? 1 : param[0]);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_IL:
- TRACE(("CASE_IL - insert line\n"));
- if ((row = param[0]) < 1)
- row = 1;
- InsertLine(screen, row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DL:
- TRACE(("CASE_DL - delete line\n"));
- if ((row = param[0]) < 1)
- row = 1;
- DeleteLine(screen, row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DCH:
- TRACE(("CASE_DCH - delete char\n"));
- if ((row = param[0]) < 1)
- row = 1;
- DeleteChar(screen, (unsigned) row);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_TRACK_MOUSE:
- /*
- * A single parameter other than zero is always scroll-down.
- * A zero-parameter is used to reset the mouse mode, and is
- * not useful for scrolling anyway.
- */
- if (nparam > 1 || param[0] == 0) {
- TRACE(("CASE_TRACK_MOUSE\n"));
- /* Track mouse as long as in window and between
- * specified rows
- */
- TrackMouse(param[0],
- param[2] - 1, param[1] - 1,
- param[3] - 1, param[4] - 2);
- } else {
- TRACE(("CASE_SD - scroll down\n"));
- /* SD */
- if ((count = param[0]) < 1)
- count = 1;
- RevScroll(screen, count);
- do_xevents();
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECID:
- TRACE(("CASE_DECID\n"));
- if_OPT_VT52_MODE(screen, {
- unparseputc(ESC, screen->respond);
- unparseputc('/', screen->respond);
- unparseputc('Z', screen->respond);
- sp->parsestate = sp->groundtable;
- break;
- });
- param[0] = DEFAULT; /* Default ID parameter */
- /* FALLTHRU */
- case CASE_DA1:
- TRACE(("CASE_DA1\n"));
- if (param[0] <= 0) { /* less than means DEFAULT */
- count = 0;
- reply.a_type = CSI;
- reply.a_pintro = '?';
-
- /* The first param corresponds to the highest
- * operating level (i.e., service level) of the
- * emulation. A DEC terminal can be setup to
- * respond with a different DA response, but
- * there's no control sequence that modifies this.
- * We set it via a resource.
- */
- if (screen->terminal_id < 200) {
- switch (screen->terminal_id) {
- case 102:
- reply.a_param[count++] = 6; /* VT102 */
- break;
- case 101:
- reply.a_param[count++] = 1; /* VT101 */
- reply.a_param[count++] = 0; /* no options */
- break;
- default: /* VT100 */
- reply.a_param[count++] = 1; /* VT100 */
- reply.a_param[count++] = 2; /* AVO */
- break;
- }
- } else {
- reply.a_param[count++] = 60 + screen->terminal_id / 100;
- reply.a_param[count++] = 1; /* 132-columns */
- reply.a_param[count++] = 2; /* printer */
- reply.a_param[count++] = 6; /* selective-erase */
-#if OPT_SUNPC_KBD
- if (term->keyboard.type == keyboardIsVT220)
-#endif
- reply.a_param[count++] = 8; /* user-defined-keys */
- reply.a_param[count++] = 9; /* national replacement charsets */
- reply.a_param[count++] = 15; /* technical characters */
- if_OPT_ISO_COLORS(screen, {
- reply.a_param[count++] = 22; /* ANSI color, VT525 */
- });
-#if OPT_DEC_LOCATOR
- reply.a_param[count++] = 29; /* ANSI text locator */
-#endif
- }
- reply.a_nparam = count;
- reply.a_inters = 0;
- reply.a_final = 'c';
- unparseseq(&reply, screen->respond);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DA2:
- TRACE(("CASE_DA2\n"));
- if (param[0] <= 0) { /* less than means DEFAULT */
- count = 0;
- reply.a_type = CSI;
- reply.a_pintro = '>';
-
- if (screen->terminal_id >= 200)
- reply.a_param[count++] = 1; /* VT220 */
- else
- reply.a_param[count++] = 0; /* VT100 (nonstandard) */
- reply.a_param[count++] = XTERM_PATCH; /* Version */
- reply.a_param[count++] = 0; /* options (none) */
- reply.a_nparam = count;
- reply.a_inters = 0;
- reply.a_final = 'c';
- unparseseq(&reply, screen->respond);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECRPTUI:
- TRACE(("CASE_DECRPTUI\n"));
- if ((screen->terminal_id >= 400)
- && (param[0] <= 0)) { /* less than means DEFAULT */
- unparseputc1(DCS, screen->respond);
- unparseputc('!', screen->respond);
- unparseputc('|', screen->respond);
- unparseputc('0', screen->respond);
- unparseputc1(ST, screen->respond);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_TBC:
- TRACE(("CASE_TBC - tab clear\n"));
- if ((row = param[0]) <= 0) /* less than means default */
- TabClear(term->tabs, screen->cur_col);
- else if (row == 3)
- TabZonk(term->tabs);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SET:
- TRACE(("CASE_SET - set mode\n"));
- ansi_modes(term, bitset);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_RST:
- TRACE(("CASE_RST - reset mode\n"));
- ansi_modes(term, bitclr);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SGR:
- for (row = 0; row < nparam; ++row) {
- if_OPT_XMC_GLITCH(screen, {
- Mark_XMC(screen, param[row]);
- });
- TRACE(("CASE_SGR %d\n", param[row]));
- switch (param[row]) {
- case DEFAULT:
- case 0:
- term->flags &=
- ~(INVERSE | BOLD | BLINK | UNDERLINE | INVISIBLE);
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Colors();
- });
- break;
- case 1: /* Bold */
- term->flags |= BOLD;
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 5: /* Blink */
- term->flags |= BLINK;
- StartBlinking(screen);
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 4: /* Underscore */
- term->flags |= UNDERLINE;
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 7:
- term->flags |= INVERSE;
- if_OPT_ISO_COLORS(screen, {
- setExtendedBG();
- });
- break;
- case 8:
- term->flags |= INVISIBLE;
- break;
- case 22: /* reset 'bold' */
- term->flags &= ~BOLD;
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 24:
- term->flags &= ~UNDERLINE;
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 25: /* reset 'blink' */
- term->flags &= ~BLINK;
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- break;
- case 27:
- term->flags &= ~INVERSE;
- if_OPT_ISO_COLORS(screen, {
- setExtendedBG();
- });
- break;
- case 28:
- term->flags &= ~INVISIBLE;
- break;
- case 30:
- case 31:
- case 32:
- case 33:
- case 34:
- case 35:
- case 36:
- case 37:
- if_OPT_ISO_COLORS(screen, {
- term->sgr_foreground = (param[row] - 30);
- term->sgr_extended = 0;
- setExtendedFG();
- });
- break;
- case 38:
- /* This is more complicated than I'd
- like, but it should properly eat all
- the parameters for unsupported modes
- */
- if_OPT_ISO_COLORS(screen, {
- row++;
- if (row < nparam) {
- switch (param[row]) {
- case 5:
- row++;
- if (row < nparam &&
- param[row] < NUM_ANSI_COLORS) {
- term->sgr_foreground = param[row];
- term->sgr_extended = 1;
- setExtendedFG();
- }
- break;
- default:
- row += 7;
- break;
- }
- }
- });
- break;
- case 39:
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Foreground();
- });
- break;
- case 40:
- case 41:
- case 42:
- case 43:
- case 44:
- case 45:
- case 46:
- case 47:
- if_OPT_ISO_COLORS(screen, {
- term->sgr_background = (param[row] - 40);
- setExtendedBG();
- });
- break;
- case 48:
- if_OPT_ISO_COLORS(screen, {
- row++;
- if (row < nparam) {
- switch (param[row]) {
- case 5:
- row++;
- if (row < nparam &&
- param[row] < NUM_ANSI_COLORS) {
- term->sgr_background = param[row];
- setExtendedBG();
- }
- break;
- default:
- row += 7;
- break;
- }
- }
- });
- break;
- case 49:
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Background();
- });
- break;
- case 90:
- case 91:
- case 92:
- case 93:
- case 94:
- case 95:
- case 96:
- case 97:
- if_OPT_AIX_COLORS(screen, {
- term->sgr_foreground = (param[row] - 90 + 8);
- term->sgr_extended = 0;
- setExtendedFG();
- });
- break;
- case 100:
-#if !OPT_AIX_COLORS
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Foreground();
- reset_SGR_Background();
- });
- break;
-#endif
- case 101:
- case 102:
- case 103:
- case 104:
- case 105:
- case 106:
- case 107:
- if_OPT_AIX_COLORS(screen, {
- term->sgr_background = (param[row] - 100 + 8);
- setExtendedBG();
- });
- break;
- }
- }
- sp->parsestate = sp->groundtable;
- break;
-
- /* DSR (except for the '?') is a superset of CPR */
- case CASE_DSR:
- sp->private_function = True;
-
- /* FALLTHRU */
- case CASE_CPR:
- TRACE(("CASE_CPR - cursor position\n"));
- count = 0;
- reply.a_type = CSI;
- reply.a_pintro = sp->private_function ? '?' : 0;
- reply.a_inters = 0;
- reply.a_final = 'n';
-
- switch (param[0]) {
- case 5:
- /* operating status */
- reply.a_param[count++] = 0; /* (no malfunction ;-) */
- break;
- case 6:
- /* CPR */
- /* DECXCPR (with page=0) */
- reply.a_param[count++] = screen->cur_row + 1;
- reply.a_param[count++] = screen->cur_col + 1;
- reply.a_final = 'R';
- break;
- case 15:
- /* printer status */
- reply.a_param[count++] = 13; /* implement printer */
- break;
- case 25:
- /* UDK status */
- reply.a_param[count++] = 20; /* UDK always unlocked */
- break;
- case 26:
- /* keyboard status */
- reply.a_param[count++] = 27;
- reply.a_param[count++] = 1; /* North American */
- if (screen->terminal_id >= 400) {
- reply.a_param[count++] = 0; /* ready */
- reply.a_param[count++] = 0; /* LK201 */
- }
- break;
- case 53:
- /* Locator status */
-#if OPT_DEC_LOCATOR
- reply.a_param[count++] = 50; /* locator ready */
-#else
- reply.a_param[count++] = 53; /* no locator */
-#endif
- break;
- }
-
- if ((reply.a_nparam = count) != 0)
- unparseseq(&reply, screen->respond);
-
- sp->parsestate = sp->groundtable;
- sp->private_function = False;
- break;
-
- case CASE_MC:
- TRACE(("CASE_MC - media control\n"));
- xtermMediaControl(param[0], False);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DEC_MC:
- TRACE(("CASE_DEC_MC - DEC media control\n"));
- xtermMediaControl(param[0], True);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_HP_MEM_LOCK:
- case CASE_HP_MEM_UNLOCK:
- TRACE(("%s\n", ((sp->parsestate[c] == CASE_HP_MEM_LOCK)
- ? "CASE_HP_MEM_LOCK"
- : "CASE_HP_MEM_UNLOCK")));
- if (screen->scroll_amt)
- FlushScroll(screen);
- if (sp->parsestate[c] == CASE_HP_MEM_LOCK)
- set_tb_margins(screen, screen->cur_row, screen->bot_marg);
- else
- set_tb_margins(screen, 0, screen->bot_marg);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSTBM:
- TRACE(("CASE_DECSTBM - set scrolling region\n"));
- if ((top = param[0]) < 1)
- top = 1;
- if (nparam < 2 || (bot = param[1]) == DEFAULT
- || bot > MaxRows(screen)
- || bot == 0)
- bot = MaxRows(screen);
- if (bot > top) {
- if (screen->scroll_amt)
- FlushScroll(screen);
- set_tb_margins(screen, top - 1, bot - 1);
- CursorSet(screen, 0, 0, term->flags);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECREQTPARM:
- TRACE(("CASE_DECREQTPARM\n"));
- if (screen->terminal_id < 200) { /* VT102 */
- if ((row = param[0]) == DEFAULT)
- row = 0;
- if (row == 0 || row == 1) {
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 7;
- reply.a_param[0] = row + 2;
- reply.a_param[1] = 1; /* no parity */
- reply.a_param[2] = 1; /* eight bits */
- reply.a_param[3] = 128; /* transmit 38.4k baud */
- reply.a_param[4] = 128; /* receive 38.4k baud */
- reply.a_param[5] = 1; /* clock multiplier ? */
- reply.a_param[6] = 0; /* STP flags ? */
- reply.a_inters = 0;
- reply.a_final = 'x';
- unparseseq(&reply, screen->respond);
- }
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSET:
- /* DECSET */
-#if OPT_VT52_MODE
- if (screen->vtXX_level != 0)
-#endif
- dpmodes(term, bitset);
- sp->parsestate = sp->groundtable;
-#if OPT_TEK4014
- if (screen->TekEmu)
- return False;
-#endif
- break;
-
- case CASE_DECRST:
- /* DECRST */
- dpmodes(term, bitclr);
-#if OPT_VT52_MODE
- if (screen->vtXX_level == 0)
- sp->groundtable = vt52_table;
- else if (screen->terminal_id >= 100)
- sp->groundtable = ansi_table;
-#endif
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECALN:
- TRACE(("CASE_DECALN - alignment test\n"));
- if (screen->cursor_state)
- HideCursor();
- set_tb_margins(screen, 0, screen->max_row);
- CursorSet(screen, 0, 0, term->flags);
- xtermParseRect(screen, 0, 0, &myRect);
- ScrnFillRectangle(screen, &myRect, 'E', 0);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_GSETS:
- TRACE(("CASE_GSETS(%d) = '%c'\n", sp->scstype, c));
- if (screen->vtXX_level != 0)
- screen->gsets[sp->scstype] = c;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSC:
- TRACE(("CASE_DECSC - save cursor\n"));
- CursorSave(term);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECRC:
- TRACE(("CASE_DECRC - restore cursor\n"));
- CursorRestore(term);
- if_OPT_ISO_COLORS(screen, {
- setExtendedFG();
- });
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECKPAM:
- TRACE(("CASE_DECKPAM\n"));
- term->keyboard.flags |= MODE_DECKPAM;
- update_appkeypad();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECKPNM:
- TRACE(("CASE_DECKPNM\n"));
- term->keyboard.flags &= ~MODE_DECKPAM;
- update_appkeypad();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CSI_QUOTE_STATE:
- sp->parsestate = csi_quo_table;
- break;
-
-#if OPT_VT52_MODE
- case CASE_VT52_FINISH:
- TRACE(("CASE_VT52_FINISH terminal_id %d, vtXX_level %d\n",
- screen->terminal_id,
- screen->vtXX_level));
- if (screen->terminal_id >= 100
- && screen->vtXX_level == 0) {
- sp->groundtable =
- sp->parsestate = ansi_table;
- screen->vtXX_level = screen->vt52_save_level;
- screen->curgl = screen->vt52_save_curgl;
- screen->curgr = screen->vt52_save_curgr;
- screen->curss = screen->vt52_save_curss;
- memmove(screen->gsets, screen->vt52_save_gsets, sizeof(screen->gsets));
- }
- break;
-#endif
-
- case CASE_ANSI_LEVEL_1:
- TRACE(("CASE_ANSI_LEVEL_1\n"));
- set_ansi_conformance(screen, 1);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_ANSI_LEVEL_2:
- TRACE(("CASE_ANSI_LEVEL_2\n"));
- set_ansi_conformance(screen, 2);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_ANSI_LEVEL_3:
- TRACE(("CASE_ANSI_LEVEL_3\n"));
- set_ansi_conformance(screen, 3);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSCL:
- TRACE(("CASE_DECSCL(%d,%d)\n", param[0], param[1]));
- if (param[0] >= 61 && param[0] <= 65) {
- /*
- * VT300, VT420, VT520 manuals claim that DECSCL does a hard
- * reset (RIS). VT220 manual states that it is a soft reset.
- * Perhaps both are right (unlikely). Kermit says it's soft.
- */
- VTReset(False, False);
- screen->vtXX_level = param[0] - 60;
- if (param[0] > 61) {
- if (param[1] == 1)
- show_8bit_control(False);
- else if (param[1] == 0 || param[1] == 2)
- show_8bit_control(True);
- }
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSCA:
- TRACE(("CASE_DECSCA\n"));
- screen->protected_mode = DEC_PROTECT;
- if (param[0] <= 0 || param[0] == 2)
- term->flags &= ~PROTECTED;
- else if (param[0] == 1)
- term->flags |= PROTECTED;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSED:
- TRACE(("CASE_DECSED\n"));
- do_erase_display(screen, param[0], DEC_PROTECT);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSEL:
- TRACE(("CASE_DECSEL\n"));
- do_erase_line(screen, param[0], DEC_PROTECT);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_ST:
- TRACE(("CASE_ST: End of String (%d bytes)\n", string_used));
- sp->parsestate = sp->groundtable;
- if (!string_used)
- break;
- string_area[--string_used] = '\0';
- switch (sp->string_mode) {
- case APC:
- /* ignored */
- break;
- case DCS:
- do_dcs(string_area, string_used);
- break;
- case OSC:
- do_osc(string_area, string_used, ST);
- break;
- case PM:
- /* ignored */
- break;
- case SOS:
- /* ignored */
- break;
- }
- break;
-
- case CASE_SOS:
- TRACE(("CASE_SOS: Start of String\n"));
- sp->string_mode = SOS;
- sp->parsestate = sos_table;
- break;
-
- case CASE_PM:
- TRACE(("CASE_PM: Privacy Message\n"));
- sp->string_mode = PM;
- sp->parsestate = sos_table;
- break;
-
- case CASE_DCS:
- TRACE(("CASE_DCS: Device Control String\n"));
- sp->string_mode = DCS;
- sp->parsestate = sos_table;
- break;
-
- case CASE_APC:
- TRACE(("CASE_APC: Application Program Command\n"));
- sp->string_mode = APC;
- sp->parsestate = sos_table;
- break;
-
- case CASE_SPA:
- TRACE(("CASE_SPA - start protected area\n"));
- screen->protected_mode = ISO_PROTECT;
- term->flags |= PROTECTED;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_EPA:
- TRACE(("CASE_EPA - end protected area\n"));
- term->flags &= ~PROTECTED;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SU:
- TRACE(("CASE_SU - scroll up\n"));
- if ((count = param[0]) < 1)
- count = 1;
- xtermScroll(screen, count);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_IND:
- TRACE(("CASE_IND - index\n"));
- xtermIndex(screen, 1);
- do_xevents();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CPL:
- TRACE(("CASE_CPL - cursor prev line\n"));
- CursorPrevLine(screen, param[0]);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CNL:
- TRACE(("CASE_NPL - cursor next line\n"));
- CursorNextLine(screen, param[0]);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_NEL:
- TRACE(("CASE_NEL\n"));
- xtermIndex(screen, 1);
- CarriageReturn(screen);
- do_xevents();
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_HTS:
- TRACE(("CASE_HTS - horizontal tab set\n"));
- TabSet(term->tabs, screen->cur_col);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_RI:
- TRACE(("CASE_RI - reverse index\n"));
- RevIndex(screen, 1);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SS2:
- TRACE(("CASE_SS2\n"));
- screen->curss = 2;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_SS3:
- TRACE(("CASE_SS3\n"));
- screen->curss = 3;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_CSI_STATE:
- /* enter csi state */
- nparam = 1;
- param[0] = DEFAULT;
- sp->parsestate = csi_table;
- break;
-
- case CASE_ESC_SP_STATE:
- /* esc space */
- sp->parsestate = esc_sp_table;
- break;
-
- case CASE_CSI_EX_STATE:
- /* csi exclamation */
- sp->parsestate = csi_ex_table;
- break;
-
-#if OPT_DEC_LOCATOR
- case CASE_CSI_TICK_STATE:
- /* csi tick (') */
- sp->parsestate = csi_tick_table;
- break;
-
- case CASE_DECEFR:
- TRACE(("CASE_DECEFR - Enable Filter Rectangle\n"));
- if (screen->send_mouse_pos == DEC_LOCATOR) {
- MotionOff(screen, term);
- if ((screen->loc_filter_top = param[0]) < 1)
- screen->loc_filter_top = LOC_FILTER_POS;
- if (nparam < 2 || (screen->loc_filter_left = param[1]) < 1)
- screen->loc_filter_left = LOC_FILTER_POS;
- if (nparam < 3 || (screen->loc_filter_bottom = param[2]) < 1)
- screen->loc_filter_bottom = LOC_FILTER_POS;
- if (nparam < 4 || (screen->loc_filter_right = param[3]) < 1)
- screen->loc_filter_right = LOC_FILTER_POS;
- InitLocatorFilter(term);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECELR:
- MotionOff(screen, term);
- if (param[0] <= 0 || param[0] > 2) {
- screen->send_mouse_pos = MOUSE_OFF;
- TRACE(("DECELR - Disable Locator Reports\n"));
- } else {
- TRACE(("DECELR - Enable Locator Reports\n"));
- screen->send_mouse_pos = DEC_LOCATOR;
- if (param[0] == 2) {
- screen->locator_reset = True;
- } else {
- screen->locator_reset = False;
- }
- if (nparam < 2 || param[1] != 1) {
- screen->locator_pixels = False;
- } else {
- screen->locator_pixels = True;
- }
- screen->loc_filter = False;
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSLE:
- TRACE(("DECSLE - Select Locator Events\n"));
- for (count = 0; count < nparam; ++count) {
- switch (param[count]) {
- case DEFAULT:
- case 0:
- MotionOff(screen, term);
- screen->loc_filter = False;
- screen->locator_events = 0;
- break;
- case 1:
- screen->locator_events |= LOC_BTNS_DN;
- break;
- case 2:
- screen->locator_events &= ~LOC_BTNS_DN;
- break;
- case 3:
- screen->locator_events |= LOC_BTNS_UP;
- break;
- case 4:
- screen->locator_events &= ~LOC_BTNS_UP;
- break;
- }
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECRQLP:
- TRACE(("DECRQLP - Request Locator Position\n"));
- if (param[0] < 2) {
- /* Issue DECLRP Locator Position Report */
- GetLocatorPosition(term);
- }
- sp->parsestate = sp->groundtable;
- break;
-#endif /* OPT_DEC_LOCATOR */
-
-#if OPT_DEC_RECTOPS
- case CASE_CSI_DOLLAR_STATE:
- /* csi dollar ($) */
- if (screen->vtXX_level >= 4)
- sp->parsestate = csi_dollar_table;
- else
- sp->parsestate = eigtable;
- break;
-
- case CASE_CSI_STAR_STATE:
- /* csi dollar (*) */
- if (screen->vtXX_level >= 4)
- sp->parsestate = csi_star_table;
- else
- sp->parsestate = eigtable;
- break;
-
- case CASE_DECCRA:
- TRACE(("CASE_DECCRA - Copy rectangular area\n"));
- xtermParseRect(screen, nparam, param, &myRect);
- ScrnCopyRectangle(screen, &myRect, nparam - 5, param + 5);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECERA:
- TRACE(("CASE_DECERA - Erase rectangular area\n"));
- xtermParseRect(screen, nparam, param, &myRect);
- ScrnFillRectangle(screen, &myRect, ' ', 0);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECFRA:
- TRACE(("CASE_DECFRA - Fill rectangular area\n"));
- if (nparam > 0
- && ((param[0] >= 32 && param[0] <= 126)
- || (param[0] >= 160 && param[0] <= 255))) {
- xtermParseRect(screen, nparam - 1, param + 1, &myRect);
- ScrnFillRectangle(screen, &myRect, param[0], term->flags);
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSERA:
- TRACE(("CASE_DECSERA - Selective erase rectangular area\n"));
- xtermParseRect(screen, nparam > 4 ? 4 : nparam, param, &myRect);
- ScrnWipeRectangle(screen, &myRect);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSACE:
- TRACE(("CASE_DECSACE - Select attribute change extent\n"));
- screen->cur_decsace = param[0];
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECCARA:
- TRACE(("CASE_DECCARA - Change attributes in rectangular area\n"));
- xtermParseRect(screen, nparam > 4 ? 4 : nparam, param, &myRect);
- ScrnMarkRectangle(screen, &myRect, False, nparam - 4, param + 4);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECRARA:
- TRACE(("CASE_DECRARA - Reverse attributes in rectangular area\n"));
- xtermParseRect(screen, nparam > 4 ? 4 : nparam, param, &myRect);
- ScrnMarkRectangle(screen, &myRect, True, nparam - 4, param + 4);
- sp->parsestate = sp->groundtable;
- break;
-#else
- case CASE_CSI_DOLLAR_STATE:
- /* csi dollar ($) */
- sp->parsestate = eigtable;
- break;
-
- case CASE_CSI_STAR_STATE:
- /* csi dollar (*) */
- sp->parsestate = eigtable;
- break;
-#endif /* OPT_DEC_RECTOPS */
-
- case CASE_S7C1T:
- TRACE(("CASE_S7C1T\n"));
- show_8bit_control(False);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_S8C1T:
- TRACE(("CASE_S8C1T\n"));
-#if OPT_VT52_MODE
- if (screen->vtXX_level <= 1)
- break;
-#endif
- show_8bit_control(True);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_OSC:
- TRACE(("CASE_OSC: Operating System Command\n"));
- sp->parsestate = sos_table;
- sp->string_mode = OSC;
- break;
-
- case CASE_RIS:
- TRACE(("CASE_RIS\n"));
- VTReset(True, True);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_DECSTR:
- TRACE(("CASE_DECSTR\n"));
- VTReset(False, False);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_REP:
- TRACE(("CASE_REP\n"));
- if (sp->lastchar >= 0 &&
- sp->groundtable[E2A(sp->lastchar)] == CASE_PRINT) {
- IChar repeated[2];
- count = (param[0] < 1) ? 1 : param[0];
- repeated[0] = sp->lastchar;
- while (count-- > 0) {
- dotext(screen,
- screen->gsets[(int) (screen->curgl)],
- repeated, 1);
- }
- }
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_LS2:
- TRACE(("CASE_LS2\n"));
- screen->curgl = 2;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_LS3:
- TRACE(("CASE_LS3\n"));
- screen->curgl = 3;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_LS3R:
- TRACE(("CASE_LS3R\n"));
- screen->curgr = 3;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_LS2R:
- TRACE(("CASE_LS2R\n"));
- screen->curgr = 2;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_LS1R:
- TRACE(("CASE_LS1R\n"));
- screen->curgr = 1;
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_XTERM_SAVE:
- savemodes(term);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_XTERM_RESTORE:
- restoremodes(term);
- sp->parsestate = sp->groundtable;
- break;
-
- case CASE_XTERM_WINOPS:
- TRACE(("CASE_XTERM_WINOPS\n"));
- if (screen->allowWindowOps)
- window_ops(term);
- sp->parsestate = sp->groundtable;
- break;
-#if OPT_WIDE_CHARS
- case CASE_ESC_PERCENT:
- sp->parsestate = esc_pct_table;
- break;
-
- case CASE_UTF8:
- /* If we did not set UTF-8 mode from resource or the
- * command-line, allow it to be enabled/disabled by
- * control sequence.
- */
- if (!screen->wide_chars) {
- WriteNow();
- ChangeToWide(screen);
- }
- if (screen->wide_chars
- && screen->utf8_mode != uAlways) {
- switchPtyData(screen, c == 'G');
- TRACE(("UTF8 mode %s\n",
- BtoS(screen->utf8_mode)));
- } else {
- TRACE(("UTF8 mode NOT turned %s (%s)\n",
- BtoS(c == 'G'),
- (screen->utf8_mode == uAlways)
- ? "UTF-8 mode set from command-line"
- : "wideChars resource was not set"));
- }
- sp->parsestate = sp->groundtable;
- break;
-#endif
-
- case CASE_CSI_IGNORE:
- sp->parsestate = cigtable;
- break;
- }
- if (sp->parsestate == sp->groundtable)
- sp->lastchar = thischar;
- } while (0);
-
-#if OPT_WIDE_CHARS
- screen->utf8_inparse = (screen->utf8_mode != uFalse
- && sp->parsestate != sos_table);
-#endif
-
- return True;
-}
-
-static void
-VTparse(void)
-{
- TScreen *screen;
-
- /* We longjmp back to this point in VTReset() */
- (void) setjmp(vtjmpbuf);
- screen = &term->screen;
- memset(&myState, 0, sizeof(myState));
-#if OPT_VT52_MODE
- myState.groundtable = screen->vtXX_level ? ansi_table : vt52_table;
-#else
- myState.groundtable = ansi_table;
-#endif
- myState.parsestate = myState.groundtable;
- myState.lastchar = -1; /* not a legal IChar */
- myState.nextstate = -1; /* not a legal state */
-
- for (;;) {
- if (!doparsing(doinput(), &myState))
- return;
- }
-}
-
-static Char *v_buffer; /* pointer to physical buffer */
-static Char *v_bufstr = NULL; /* beginning of area to write */
-static Char *v_bufptr; /* end of area to write */
-static Char *v_bufend; /* end of physical buffer */
-
-/* Write data to the pty as typed by the user, pasted with the mouse,
- or generated by us in response to a query ESC sequence. */
-
-int
-v_write(int f, Char * data, unsigned len)
-{
- int riten;
- unsigned c = len;
-
- if (v_bufstr == NULL && len > 0) {
- v_buffer = (Char *) XtMalloc(len);
- v_bufstr = v_buffer;
- v_bufptr = v_buffer;
- v_bufend = v_buffer + len;
- }
-#ifdef DEBUG
- if (debug) {
- fprintf(stderr, "v_write called with %d bytes (%d left over)",
- len, v_bufptr - v_bufstr);
- if (len > 1 && len < 10)
- fprintf(stderr, " \"%.*s\"", len, (char *) data);
- fprintf(stderr, "\n");
- }
-#endif
-
-#ifdef VMS
- if ((1 << f) != pty_mask)
- return (tt_write((char *) data, len));
-#else /* VMS */
- if (!FD_ISSET(f, &pty_mask))
- return (write(f, (char *) data, len));
-#endif /* VMS */
-
- /*
- * Append to the block we already have.
- * Always doing this simplifies the code, and
- * isn't too bad, either. If this is a short
- * block, it isn't too expensive, and if this is
- * a long block, we won't be able to write it all
- * anyway.
- */
-
- if (len > 0) {
-#if OPT_DABBREV
- term->screen.dabbrev_working = 0; /* break dabbrev sequence */
-#endif
- if (v_bufend < v_bufptr + len) { /* we've run out of room */
- if (v_bufstr != v_buffer) {
- /* there is unused space, move everything down */
- /* possibly overlapping memmove here */
-#ifdef DEBUG
- if (debug)
- fprintf(stderr, "moving data down %d\n",
- v_bufstr - v_buffer);
-#endif
- memmove(v_buffer, v_bufstr, (unsigned) (v_bufptr - v_bufstr));
- v_bufptr -= v_bufstr - v_buffer;
- v_bufstr = v_buffer;
- }
- if (v_bufend < v_bufptr + len) {
- /* still won't fit: get more space */
- /* Don't use XtRealloc because an error is not fatal. */
- int size = v_bufptr - v_buffer; /* save across realloc */
- v_buffer = TypeRealloc(Char, size + len, v_buffer);
- if (v_buffer) {
-#ifdef DEBUG
- if (debug)
- fprintf(stderr, "expanded buffer to %d\n",
- size + len);
-#endif
- v_bufstr = v_buffer;
- v_bufptr = v_buffer + size;
- v_bufend = v_bufptr + len;
- } else {
- /* no memory: ignore entire write request */
- fprintf(stderr, "%s: cannot allocate buffer space\n",
- xterm_name);
- v_buffer = v_bufstr; /* restore clobbered pointer */
- c = 0;
- }
- }
- }
- if (v_bufend >= v_bufptr + len) {
- /* new stuff will fit */
- memmove(v_bufptr, data, len);
- v_bufptr += len;
- }
- }
-
- /*
- * Write out as much of the buffer as we can.
- * Be careful not to overflow the pty's input silo.
- * We are conservative here and only write
- * a small amount at a time.
- *
- * If we can't push all the data into the pty yet, we expect write
- * to return a non-negative number less than the length requested
- * (if some data written) or -1 and set errno to EAGAIN,
- * EWOULDBLOCK, or EINTR (if no data written).
- *
- * (Not all systems do this, sigh, so the code is actually
- * a little more forgiving.)
- */
-
-#define MAX_PTY_WRITE 128 /* 1/2 POSIX minimum MAX_INPUT */
-
- if (v_bufptr > v_bufstr) {
-#ifdef VMS
- riten = tt_write(v_bufstr,
- ((v_bufptr - v_bufstr <= VMS_TERM_BUFFER_SIZE)
- ? v_bufptr - v_bufstr
- : VMS_TERM_BUFFER_SIZE));
- if (riten == 0)
- return (riten);
-#else /* VMS */
- riten = write(f, v_bufstr,
- (size_t) ((v_bufptr - v_bufstr <= MAX_PTY_WRITE)
- ? v_bufptr - v_bufstr
- : MAX_PTY_WRITE));
- if (riten < 0)
-#endif /* VMS */
- {
-#ifdef DEBUG
- if (debug)
- perror("write");
-#endif
- riten = 0;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(stderr, "write called with %d, wrote %d\n",
- v_bufptr - v_bufstr <= MAX_PTY_WRITE ?
- v_bufptr - v_bufstr : MAX_PTY_WRITE,
- riten);
-#endif
- v_bufstr += riten;
- if (v_bufstr >= v_bufptr) /* we wrote it all */
- v_bufstr = v_bufptr = v_buffer;
- }
-
- /*
- * If we have lots of unused memory allocated, return it
- */
- if (v_bufend - v_bufptr > 1024) { /* arbitrary hysteresis */
- /* save pointers across realloc */
- int start = v_bufstr - v_buffer;
- int size = v_bufptr - v_buffer;
- unsigned allocsize = (unsigned) (size ? size : 1);
-
- v_buffer = TypeRealloc(Char, allocsize, v_buffer);
- if (v_buffer) {
- v_bufstr = v_buffer + start;
- v_bufptr = v_buffer + size;
- v_bufend = v_buffer + allocsize;
-#ifdef DEBUG
- if (debug)
- fprintf(stderr, "shrunk buffer to %d\n", allocsize);
-#endif
- } else {
- /* should we print a warning if couldn't return memory? */
- v_buffer = v_bufstr - start; /* restore clobbered pointer */
- }
- }
- return (c);
-}
-
-#ifdef VMS
-#define ptymask() (v_bufptr > v_bufstr ? pty_mask : 0)
-
-static void
-in_put(void)
-{
- static PtySelect select_mask;
- static PtySelect write_mask;
- int update = VTbuffer->update;
- int size;
-
- int status;
- Dimension replyWidth, replyHeight;
- XtGeometryResult stat;
-
- TScreen *screen = &term->screen;
- char *cp;
- int i;
-
- select_mask = pty_mask; /* force initial read */
- for (;;) {
-
- /* if the terminal changed size, resize the widget */
- if (tt_changed) {
- tt_changed = False;
-
- stat = XtMakeResizeRequest((Widget) term,
- ((Dimension) FontWidth(screen)
- * (tt_width)
- + 2 * screen->border
- + screen->fullVwin.sb_info.width),
- ((Dimension) FontHeight(screen)
- * (tt_length)
- + 2 * screen->border),
- &replyWidth, &replyHeight);
-
- if (stat == XtGeometryYes || stat == XtGeometryDone) {
- term->core.width = replyWidth;
- term->core.height = replyHeight;
-
- ScreenResize(&term->screen, replyWidth, replyHeight,
- &term->flags);
- }
- repairSizeHints();
- }
-
- if (eventMode == NORMAL
- && readPtyData(screen, &select_mask, VTbuffer)) {
- if (screen->scrollWidget
- && screen->scrollttyoutput
- && screen->topline < 0)
- /* Scroll to bottom */
- WindowScroll(screen, 0);
- break;
- }
- if (screen->scroll_amt)
- FlushScroll(screen);
- if (screen->cursor_set && CursorMoved(screen)) {
- if (screen->cursor_state)
- HideCursor();
- ShowCursor();
-#if OPT_INPUT_METHOD
- PreeditPosition(screen);
-#endif
- } else if (screen->cursor_set != screen->cursor_state) {
- if (screen->cursor_set)
- ShowCursor();
- else
- HideCursor();
- }
-
- if (QLength(screen->display)) {
- select_mask = X_mask;
- } else {
- write_mask = ptymask();
- XFlush(screen->display);
- select_mask = Select_mask;
- if (eventMode != NORMAL)
- select_mask = X_mask;
- }
- if (write_mask & ptymask()) {
- v_write(screen->respond, 0, 0); /* flush buffer */
- }
-
- if (select_mask & X_mask) {
- xevents();
- if (VTbuffer->update != update)
- break;
- }
- }
-}
-#else /* VMS */
-
-static void
-in_put(void)
-{
- static PtySelect select_mask;
- static PtySelect write_mask;
-
- TScreen *screen = &term->screen;
- int i, time_select;
- int size;
- int update = VTbuffer->update;
-
- static struct timeval select_timeout;
-
-#if OPT_BLINK_CURS
- /*
- * Compute the timeout for the blinking cursor to be much smaller than
- * the "on" or "off" interval.
- */
- int tick = ((screen->blink_on < screen->blink_off)
- ? screen->blink_on
- : screen->blink_off);
- tick *= (1000 / 8); /* 1000 for msec/usec, 8 for "much" smaller */
- if (tick < 1)
- tick = 1;
-#endif
-
- for (;;) {
- if (eventMode == NORMAL
- && (size = readPtyData(screen, &select_mask, VTbuffer)) != 0) {
- if (screen->scrollWidget
- && screen->scrollttyoutput
- && screen->topline < 0)
- WindowScroll(screen, 0); /* Scroll to bottom */
- /* stop speed reading at some point to look for X stuff */
- TRACE(("VTbuffer uses %d/%d\n",
- VTbuffer->last - VTbuffer->buffer,
- BUF_SIZE));
- if ((VTbuffer->last - VTbuffer->buffer) > BUF_SIZE) {
- FD_CLR(screen->respond, &select_mask);
- break;
- }
-#if defined(HAVE_SCHED_YIELD)
- /*
- * If we've read a full (small/fragment) buffer, let the operating
- * system have a turn, and we'll resume reading until we've either
- * read only a fragment of the buffer, or we've filled the large
- * buffer (see above). Doing this helps keep up with large bursts
- * of output.
- */
- if (size == FRG_SIZE) {
- select_timeout.tv_sec = 0;
- i = Select(max_plus1, &select_mask, &write_mask, 0,
- &select_timeout);
- if (i > 0) {
- sched_yield();
- } else
- break;
- } else {
- break;
- }
-#else
- (void) size; /* unused in this branch */
- break;
-#endif
- }
- /* update the screen */
- if (screen->scroll_amt)
- FlushScroll(screen);
- if (screen->cursor_set && CursorMoved(screen)) {
- if (screen->cursor_state)
- HideCursor();
- ShowCursor();
-#if OPT_INPUT_METHOD
- PreeditPosition(screen);
-#endif
- } else if (screen->cursor_set != screen->cursor_state) {
- if (screen->cursor_set)
- ShowCursor();
- else
- HideCursor();
- }
-
- XFlush(screen->display); /* always flush writes before waiting */
-
- /* Update the masks and, unless X events are already in the queue,
- wait for I/O to be possible. */
- XFD_COPYSET(&Select_mask, &select_mask);
- /* in selection mode xterm does not read pty */
- if (eventMode != NORMAL)
- FD_CLR(screen->respond, &select_mask);
-
- if (v_bufptr > v_bufstr) {
- XFD_COPYSET(&pty_mask, &write_mask);
- } else
- FD_ZERO(&write_mask);
- select_timeout.tv_sec = 0;
- time_select = 0;
-
- /*
- * if there's either an XEvent or an XtTimeout pending, just take
- * a quick peek, i.e. timeout from the select() immediately. If
- * there's nothing pending, let select() block a little while, but
- * for a shorter interval than the arrow-style scrollbar timeout.
- * The blocking is optional, because it tends to increase the load
- * on the host.
- */
- if (XtAppPending(app_con)) {
- select_timeout.tv_usec = 0;
- time_select = 1;
- } else if (screen->awaitInput) {
- select_timeout.tv_usec = 50000;
- time_select = 1;
-#if OPT_BLINK_CURS
- } else if ((screen->blink_timer != 0 &&
- ((screen->select & FOCUS) || screen->always_highlight)) ||
- (screen->cursor_state == BLINKED_OFF)) {
- select_timeout.tv_usec = tick;
- while (select_timeout.tv_usec > 1000000) {
- select_timeout.tv_usec -= 1000000;
- select_timeout.tv_sec++;
- }
- time_select = 1;
-#endif
-#if OPT_SESSION_MGT
- } else if (resource.sessionMgt) {
- /*
- * When session management is enabled, we should not block since
- * session related events can arrive any time.
- */
- select_timeout.tv_sec = 1;
- select_timeout.tv_usec = 0;
- time_select = 1;
-#endif
- }
- if (need_cleanup)
- Cleanup(0);
- i = Select(max_plus1, &select_mask, &write_mask, 0,
- (time_select ? &select_timeout : 0));
- if (i < 0) {
- if (errno != EINTR)
- SysError(ERROR_SELECT);
- continue;
- }
-
- /* if there is room to write more data to the pty, go write more */
- if (FD_ISSET(screen->respond, &write_mask)) {
- v_write(screen->respond, (Char *) 0, 0); /* flush buffer */
- }
-
- /* if there are X events already in our queue, it
- counts as being readable */
- if (XtAppPending(app_con) ||
- FD_ISSET(ConnectionNumber(screen->display), &select_mask)) {
- xevents();
- if (VTbuffer->update != update) /* HandleInterpret */
- break;
- }
-
- }
-}
-#endif /* VMS */
-
-static IChar
-doinput(void)
-{
- TScreen *screen = &term->screen;
-
- while (!morePtyData(screen, VTbuffer))
- in_put();
- return nextPtyData(screen, VTbuffer);
-}
-
-#if OPT_INPUT_METHOD
-/*
- * For OverTheSpot, client has to inform the position for XIM preedit.
- */
-static void
-PreeditPosition(TScreen * screen)
-{
- XPoint spot;
- XVaNestedList list;
-
- if (!screen->xic)
- return;
- spot.x = CurCursorX(screen, screen->cur_row, screen->cur_col);
- spot.y = CursorY(screen, screen->cur_row) + screen->fs_ascent;
- list = XVaCreateNestedList(0,
- XNSpotLocation, &spot,
- XNForeground, T_COLOR(screen, TEXT_FG),
- XNBackground, T_COLOR(screen, TEXT_BG),
- NULL);
- XSetICValues(screen->xic, XNPreeditAttributes, list, NULL);
- XFree(list);
-}
-#endif
-
-/*
- * process a string of characters according to the character set indicated
- * by charset. worry about end of line conditions (wraparound if selected).
- */
-void
-dotext(TScreen * screen,
- int charset,
- IChar * buf, /* start of characters to process */
- Cardinal len) /* end */
-{
-#if OPT_WIDE_CHARS
- Cardinal chars_chomped = 1;
-#else
- int next_col, last_col, this_col; /* must be signed */
-#endif
- Cardinal offset;
-
-#if OPT_WIDE_CHARS
- /* don't translate if we use UTF-8, and are not handling legacy support
- * for line-drawing characters.
- */
- if ((screen->utf8_mode == uFalse)
- || (screen->vt100_graphics && charset == '0'))
-#endif
-
- if (!xtermCharSetOut(buf, buf + len, charset))
- return;
-
- if_OPT_XMC_GLITCH(screen, {
- Cardinal n;
- if (charset != '?') {
- for (n = 0; n < len; n++) {
- if (buf[n] == XMC_GLITCH)
- buf[n] = XMC_GLITCH + 1;
- }
- }
- });
-
-#if OPT_WIDE_CHARS
- for (offset = 0;
- offset < len && (chars_chomped > 0 || screen->do_wrap);
- offset += chars_chomped) {
- int width_available = MaxCols(screen) - screen->cur_col;
- int width_here = 0;
- int need_wrap = 0;
- chars_chomped = 0;
-
- if (screen->do_wrap && (term->flags & WRAPAROUND)) {
- /* mark that we had to wrap this line */
- ScrnSetWrapped(screen, screen->cur_row);
- xtermAutoPrint('\n');
- xtermIndex(screen, 1);
- set_cur_col(screen, 0);
- screen->do_wrap = 0;
- width_available = MaxCols(screen) - screen->cur_col;
- }
-
- while (width_here <= width_available && chars_chomped < (len - offset)) {
- if (!screen->utf8_mode
- || (screen->vt100_graphics && charset == '0'))
- width_here++;
- else
- width_here += my_wcwidth((int) buf[chars_chomped + offset]);
- chars_chomped++;
- }
-
- if (width_here > width_available) {
- chars_chomped--;
- if (!screen->utf8_mode
- || (screen->vt100_graphics && charset == '0'))
- width_here--;
- else
- width_here -= my_wcwidth((int) buf[chars_chomped + offset]);
- need_wrap = 1;
- } else if (width_here == width_available) {
- need_wrap = 1;
- } else if (chars_chomped != (len - offset)) {
- need_wrap = 1;
- }
-
- /*
- * Split the wide characters back into separate arrays of 8-bit
- * characters so we can use the existing interface.
- *
- * FIXME: If we rewrote this interface, it would involve
- * rewriting all of the memory-management for the screen
- * buffers (perhaps this is simpler).
- */
- if (chars_chomped != 0) {
- static unsigned limit;
- static Char *hibyte, *lobyte;
- Bool both = False;
- unsigned j, k;
-
- if (chars_chomped >= limit) {
- limit = (chars_chomped + 1) * 2;
- lobyte = (Char *) XtRealloc((char *) lobyte, limit);
- hibyte = (Char *) XtRealloc((char *) hibyte, limit);
- }
- for (j = offset; j < offset + chars_chomped; j++) {
- k = j - offset;
- lobyte[k] = buf[j];
- if (buf[j] > 255) {
- hibyte[k] = (buf[j] >> 8);
- both = True;
- } else {
- hibyte[k] = 0;
- }
- }
-
- WriteText(screen, PAIRED_CHARS(lobyte,
- (both ? hibyte : 0)),
- chars_chomped);
- }
- screen->do_wrap = need_wrap;
- }
-#else
-
- for (offset = 0; offset < len; offset += this_col) {
- last_col = CurMaxCol(screen, screen->cur_row);
- this_col = last_col - screen->cur_col + 1;
- if (this_col <= 1) {
- if (screen->do_wrap && (term->flags & WRAPAROUND)) {
- /* mark that we had to wrap this line */
- ScrnSetWrapped(screen, screen->cur_row);
- xtermAutoPrint('\n');
- xtermIndex(screen, 1);
- set_cur_col(screen, 0);
- screen->do_wrap = 0;
- this_col = last_col + 1;
- } else
- this_col = 1;
- }
- if (offset + this_col > len) {
- this_col = len - offset;
- }
- next_col = screen->cur_col + this_col;
-
- WriteText(screen, PAIRED_CHARS(buf + offset,
- buf2 ? buf2 + offset : 0),
- this_col);
-
- /*
- * the call to WriteText updates screen->cur_col.
- * If screen->cur_col != next_col, we must have
- * hit the right margin, so set the do_wrap flag.
- */
- screen->do_wrap = (screen->cur_col < (int) next_col);
- }
-
-#endif
-}
-
-#if HANDLE_STRUCT_NOTIFY
-/* Flag icon name with "*** " on window output when iconified.
- * I'd like to do something like reverse video, but I don't
- * know how to tell this to window managers in general.
- *
- * mapstate can be IsUnmapped, !IsUnmapped, or -1;
- * -1 means no change; the other two are set by event handlers
- * and indicate a new mapstate. !IsMapped is done in the handler.
- * we worry about IsUnmapped when output occurs. -IAN!
- */
-static int mapstate = -1;
-#endif /* HANDLE_STRUCT_NOTIFY */
-
-#if OPT_WIDE_CHARS
-unsigned
-visual_width(PAIRED_CHARS(Char * str, Char * str2), Cardinal len)
-{
- /* returns the visual width of a string (doublewide characters count
- as 2, normalwide characters count as 1) */
- int my_len = 0;
- while (len) {
- int ch = *str;
- if (str2)
- ch |= *str2 << 8;
- if (str)
- str++;
- if (str2)
- str2++;
- if (iswide(ch))
- my_len += 2;
- else
- my_len++;
- len--;
- }
- return my_len;
-}
-#endif
-
-/*
- * write a string str of length len onto the screen at
- * the current cursor position. update cursor position.
- */
-static void
-WriteText(TScreen * screen, PAIRED_CHARS(Char * str, Char * str2), Cardinal len)
-{
- ScrnPtr PAIRED_CHARS(temp_str = 0, temp_str2 = 0);
- unsigned test;
- unsigned flags = term->flags;
- unsigned fg_bg = makeColorPair(term->cur_foreground, term->cur_background);
- unsigned cells = visual_width(PAIRED_CHARS(str, str2), len);
- GC currentGC;
-
- TRACE(("WriteText (%2d,%2d) (%d) %3d:%s\n",
- screen->cur_row,
- screen->cur_col,
- curXtermChrSet(screen->cur_row),
- len, visibleChars(PAIRED_CHARS(str, str2), len)));
-
- if (ScrnHaveSelection(screen)
- && ScrnIsLineInSelection(screen, screen->cur_row - screen->topline)) {
- ScrnDisownSelection(screen);
- }
-
- if (screen->cur_row - screen->topline <= screen->max_row) {
- if (screen->cursor_state)
- HideCursor();
-
- if (flags & INSERT) {
- InsertChar(screen, cells);
- }
- if (!AddToRefresh(screen)) {
-
- if (screen->scroll_amt)
- FlushScroll(screen);
-
- if (flags & INVISIBLE) {
- if (cells > len) {
- str = temp_str = TypeMallocN(Char, cells);
- if (str == 0)
- return;
- }
- if_OPT_WIDE_CHARS(screen, {
- if (cells > len) {
- str2 = temp_str2 = TypeMallocN(Char, cells);
- }
- });
- len = cells;
-
- memset(str, ' ', len);
- if_OPT_WIDE_CHARS(screen, {
- if (str2 != 0)
- memset(str2, 0, len);
- });
- }
-
- TRACE(("WriteText calling drawXtermText (%d,%d)\n",
- screen->cur_col,
- screen->cur_row));
-
- test = flags;
- checkVeryBoldColors(test, term->cur_foreground);
-
- /* make sure that the correct GC is current */
- currentGC = updatedXtermGC(screen, flags, fg_bg, False);
-
- drawXtermText(screen, test & DRAWX_MASK, currentGC,
- CurCursorX(screen, screen->cur_row, screen->cur_col),
- CursorY(screen, screen->cur_row),
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(str, str2), len, 0);
-
- resetXtermGC(screen, flags, False);
- }
- }
-
- ScreenWrite(screen, PAIRED_CHARS(str, str2), flags, fg_bg, len);
- CursorForward(screen, (int) cells);
-#if OPT_ZICONBEEP
- /* Flag icon name with "***" on window output when iconified.
- */
- if (zIconBeep && mapstate == IsUnmapped && !zIconBeep_flagged) {
- static char *icon_name;
- static Arg args[] =
- {
- {XtNiconName, (XtArgVal) & icon_name}
- };
-
- icon_name = NULL;
- XtGetValues(toplevel, args, XtNumber(args));
-
- if (icon_name != NULL) {
- zIconBeep_flagged = True;
- Changename(icon_name);
- }
- if (zIconBeep > 0) {
-#if defined(HAVE_XKBBELL)
- XkbBell(XtDisplay(toplevel), VShellWindow, zIconBeep, XkbBI_Info);
-#else
- XBell(XtDisplay(toplevel), zIconBeep);
-#endif
- }
- }
- mapstate = -1;
-#endif /* OPT_ZICONBEEP */
- if (temp_str != 0)
- free(temp_str);
- if_OPT_WIDE_CHARS(screen, {
- if (temp_str2 != 0)
- free(temp_str2);
- });
- return;
-}
-
-#if HANDLE_STRUCT_NOTIFY
-/* Flag icon name with "***" on window output when iconified.
- */
-static void
-HandleStructNotify(Widget w GCC_UNUSED,
- XtPointer closure GCC_UNUSED,
- XEvent * event,
- Boolean * cont GCC_UNUSED)
-{
- static char *icon_name;
- static Arg args[] =
- {
- {XtNiconName, (XtArgVal) & icon_name}
- };
-
- switch (event->type) {
- case MapNotify:
- TRACE(("HandleStructNotify(MapNotify)\n"));
-#if OPT_ZICONBEEP
- if (zIconBeep_flagged) {
- zIconBeep_flagged = False;
- icon_name = NULL;
- XtGetValues(toplevel, args, XtNumber(args));
- if (icon_name != NULL) {
- char *buf = CastMallocN(char, strlen(icon_name));
- if (buf == NULL) {
- zIconBeep_flagged = True;
- return;
- }
- strcpy(buf, icon_name + 4);
- Changename(buf);
- free(buf);
- }
- }
-#endif /* OPT_ZICONBEEP */
- mapstate = !IsUnmapped;
- break;
- case UnmapNotify:
- TRACE(("HandleStructNotify(UnmapNotify)\n"));
- mapstate = IsUnmapped;
- break;
- case ConfigureNotify:
- TRACE(("HandleStructNotify(ConfigureNotify)\n"));
-#if OPT_TOOLBAR
- /* the notify is for the top-level widget, but we care about vt100 */
- if (term->screen.Vshow) {
- TScreen *screen = &term->screen;
- struct _vtwin *Vwin = WhichVWin(&(term->screen));
- TbInfo *info = &(Vwin->tb_info);
- TbInfo save = *info;
-
- if (info->menu_bar) {
- XtVaGetValues(info->menu_bar,
- XtNheight, &info->menu_height,
- XtNborderWidth, &info->menu_border,
- (XtPointer) 0);
-
- if (save.menu_height != info->menu_height
- || save.menu_border != info->menu_border) {
-
- TRACE(("...menu_height %d\n", info->menu_height));
- TRACE(("...menu_border %d\n", info->menu_border));
- TRACE(("...had height %d, border %d\n",
- save.menu_height,
- save.menu_border));
-
- /*
- * FIXME: Window manager still may be using the old values.
- * Try to fool it.
- */
- XtMakeResizeRequest((Widget) term,
- screen->fullVwin.fullwidth,
- info->menu_height
- - save.menu_height
- + screen->fullVwin.fullheight,
- NULL, NULL);
- repairSizeHints();
- }
- }
- }
-#endif /* OPT_TOOLBAR */
- break;
- default:
- TRACE(("HandleStructNotify(event %d)\n", event->type));
- break;
- }
-}
-#endif /* HANDLE_STRUCT_NOTIFY */
-
-#if OPT_BLINK_CURS
-static void
-SetCursorBlink(TScreen * screen, int enable)
-{
- screen->cursor_blink = enable;
- if (DoStartBlinking(screen)) {
- StartBlinking(screen);
- } else {
-#if !OPT_BLINK_TEXT
- StopBlinking(screen);
-#endif
- }
- update_cursorblink();
-}
-
-void
-ToggleCursorBlink(TScreen * screen)
-{
- SetCursorBlink(screen, !(screen->cursor_blink));
-}
-#endif
-
-/*
- * process ANSI modes set, reset
- */
-static void
-ansi_modes(XtermWidget termw,
- void (*func) (unsigned *p, unsigned mask))
-{
- int i;
-
- for (i = 0; i < nparam; ++i) {
- switch (param[i]) {
- case 2: /* KAM (if set, keyboard locked */
- (*func) (&termw->keyboard.flags, MODE_KAM);
- break;
-
- case 4: /* IRM */
- (*func) (&termw->flags, INSERT);
- break;
-
- case 12: /* SRM (if set, local echo */
- (*func) (&termw->keyboard.flags, MODE_SRM);
- break;
-
- case 20: /* LNM */
- (*func) (&termw->flags, LINEFEED);
- update_autolinefeed();
- break;
- }
- }
-}
-
-#define set_mousemode(mode) \
- screen->send_mouse_pos = (func == bitset) ? mode : MOUSE_OFF
-#define set_mouseflag(f) \
- ((func == bitset) \
- ? SCREEN_FLAG_set(screen, f) \
- : SCREEN_FLAG_unset(screen, f))
-
-/*
- * process DEC private modes set, reset
- */
-static void
-dpmodes(XtermWidget termw,
- void (*func) (unsigned *p, unsigned mask))
-{
- TScreen *screen = &termw->screen;
- int i, j;
-
- for (i = 0; i < nparam; ++i) {
- TRACE(("%s %d\n", (func == bitset) ? "DECSET" : "DECRST", param[i]));
- switch (param[i]) {
- case 1: /* DECCKM */
- (*func) (&termw->keyboard.flags, MODE_DECCKM);
- update_appcursor();
- break;
- case 2: /* DECANM - ANSI/VT52 mode */
- if (func == bitset) { /* ANSI (VT100) */
- /*
- * Setting DECANM should have no effect, since this function
- * cannot be reached from vt52 mode.
- */
- ;
- }
-#if OPT_VT52_MODE
- else if (screen->terminal_id >= 100) { /* VT52 */
- TRACE(("DECANM terminal_id %d, vtXX_level %d\n",
- screen->terminal_id,
- screen->vtXX_level));
- screen->vt52_save_level = screen->vtXX_level;
- screen->vtXX_level = 0;
- screen->vt52_save_curgl = screen->curgl;
- screen->vt52_save_curgr = screen->curgr;
- screen->vt52_save_curss = screen->curss;
- memmove(screen->vt52_save_gsets, screen->gsets, sizeof(screen->gsets));
- resetCharsets(screen);
- nparam = 0; /* ignore the remaining params, if any */
- }
-#endif
- break;
- case 3: /* DECCOLM */
- if (screen->c132) {
- ClearScreen(screen);
- CursorSet(screen, 0, 0, termw->flags);
- if ((j = func == bitset ? 132 : 80) !=
- ((termw->flags & IN132COLUMNS) ? 132 : 80) ||
- j != MaxCols(screen))
- RequestResize(termw, -1, j, True);
- (*func) (&termw->flags, IN132COLUMNS);
- }
- break;
- case 4: /* DECSCLM (slow scroll) */
- if (func == bitset) {
- screen->jumpscroll = 0;
- if (screen->scroll_amt)
- FlushScroll(screen);
- } else
- screen->jumpscroll = 1;
- (*func) (&termw->flags, SMOOTHSCROLL);
- update_jumpscroll();
- break;
- case 5: /* DECSCNM */
- j = termw->flags;
- (*func) (&termw->flags, REVERSE_VIDEO);
- if ((termw->flags ^ j) & REVERSE_VIDEO)
- ReverseVideo(termw);
- /* update_reversevideo done in RevVid */
- break;
-
- case 6: /* DECOM */
- (*func) (&termw->flags, ORIGIN);
- CursorSet(screen, 0, 0, termw->flags);
- break;
-
- case 7: /* DECAWM */
- (*func) (&termw->flags, WRAPAROUND);
- update_autowrap();
- break;
- case 8: /* DECARM */
- /* ignore autorepeat
- * XAutoRepeatOn() and XAutoRepeatOff() can do this, but only
- * for the whole display - not limited to a given window.
- */
- break;
- case SET_X10_MOUSE: /* MIT bogus sequence */
- MotionOff(screen, termw);
- set_mousemode(X10_MOUSE);
- break;
-#if OPT_TOOLBAR
- case 10: /* rxvt */
- ShowToolbar(func == bitset);
- break;
-#endif
-#if OPT_BLINK_CURS
- case 12: /* att610: Start/stop blinking cursor */
- if (screen->cursor_blink_res) {
- screen->cursor_blink_esc = (func == bitset) ? ON : OFF;
- SetCursorBlink(screen, screen->cursor_blink);
- }
- break;
-#endif
- case 18: /* DECPFF: print form feed */
- screen->printer_formfeed = (func == bitset) ? ON : OFF;
- break;
- case 19: /* DECPEX: print extent */
- screen->printer_extent = (func == bitset) ? ON : OFF;
- break;
- case 25: /* DECTCEM: Show/hide cursor (VT200) */
- screen->cursor_set = (func == bitset) ? ON : OFF;
- break;
- case 30: /* rxvt */
- if (screen->fullVwin.sb_info.width != ((func == bitset) ? ON : OFF))
- ToggleScrollBar(termw);
- break;
-#if OPT_SHIFT_FONTS
- case 35: /* rxvt */
- term->misc.shift_fonts = (func == bitset) ? ON : OFF;
- break;
-#endif
- case 38: /* DECTEK */
-#if OPT_TEK4014
- if (func == bitset && !(screen->inhibit & I_TEK)) {
- FlushLog(screen);
- screen->TekEmu = True;
- }
-#endif
- break;
- case 40: /* 132 column mode */
- screen->c132 = (func == bitset);
- update_allow132();
- break;
- case 41: /* curses hack */
- screen->curses = (func == bitset);
- update_cursesemul();
- break;
- case 42: /* DECNRCM national charset (VT220) */
- (*func) (&termw->flags, NATIONAL);
- break;
- case 44: /* margin bell */
- screen->marginbell = (func == bitset);
- if (!screen->marginbell)
- screen->bellarmed = -1;
- update_marginbell();
- break;
- case 45: /* reverse wraparound */
- (*func) (&termw->flags, REVERSEWRAP);
- update_reversewrap();
- break;
-#ifdef ALLOWLOGGING
- case 46: /* logging */
-#ifdef ALLOWLOGFILEONOFF
- /*
- * if this feature is enabled, logging may be
- * enabled and disabled via escape sequences.
- */
- if (func == bitset)
- StartLog(screen);
- else
- CloseLog(screen);
-#else
- Bell(XkbBI_Info, 0);
- Bell(XkbBI_Info, 0);
-#endif /* ALLOWLOGFILEONOFF */
- break;
-#endif
- case 1049: /* alternate buffer & cursor */
- if (!termw->misc.titeInhibit) {
- if (func == bitset) {
- CursorSave(termw);
- ToAlternate(screen);
- ClearScreen(screen);
- } else {
- FromAlternate(screen);
- CursorRestore(termw);
- }
- } else if (termw->misc.tiXtraScroll) {
- if (func == bitset) {
- xtermScroll(screen, screen->max_row);
- }
- }
- break;
- case 1047:
- case 47: /* alternate buffer */
- if (!termw->misc.titeInhibit) {
- if (func == bitset) {
- ToAlternate(screen);
- } else {
- if (screen->alternate
- && (param[i] == 1047))
- ClearScreen(screen);
- FromAlternate(screen);
- }
- } else if (termw->misc.tiXtraScroll) {
- if (func == bitset) {
- xtermScroll(screen, screen->max_row);
- }
- }
- break;
- case 66: /* DECNKM */
- (*func) (&termw->keyboard.flags, MODE_DECKPAM);
- update_appkeypad();
- break;
- case 67: /* DECBKM */
- /* back-arrow mapped to backspace or delete(D) */
- (*func) (&termw->keyboard.flags, MODE_DECBKM);
- TRACE(("DECSET DECBKM %s\n",
- BtoS(termw->keyboard.flags & MODE_DECBKM)));
- update_decbkm();
- break;
- case SET_VT200_MOUSE: /* xterm bogus sequence */
- MotionOff(screen, termw);
- set_mousemode(VT200_MOUSE);
- break;
- case SET_VT200_HIGHLIGHT_MOUSE: /* xterm sequence w/hilite tracking */
- MotionOff(screen, termw);
- set_mousemode(VT200_HIGHLIGHT_MOUSE);
- break;
- case SET_BTN_EVENT_MOUSE:
- MotionOff(screen, termw);
- set_mousemode(BTN_EVENT_MOUSE);
- break;
- case SET_ANY_EVENT_MOUSE:
- set_mousemode(ANY_EVENT_MOUSE);
- if (screen->send_mouse_pos == MOUSE_OFF) {
- MotionOff(screen, term);
- } else {
- MotionOn(screen, term);
- }
- break;
- case 1010: /* rxvt */
- screen->scrollttyoutput = (func == bitset) ? ON : OFF;
- update_scrollttyoutput();
- break;
- case 1011: /* rxvt */
- screen->scrollkey = (func == bitset) ? ON : OFF;
- update_scrollkey();
- break;
-#if OPT_NUM_LOCK
- case 1035:
- term->misc.real_NumLock = (func == bitset) ? ON : OFF;
- update_num_lock();
- break;
- case 1036:
- screen->meta_sends_esc = (func == bitset) ? ON : OFF;
- update_meta_esc();
- break;
-#endif
- case 1037:
- screen->delete_is_del = (func == bitset) ? ON : OFF;
- update_delete_del();
- break;
- case 1048:
- if (!termw->misc.titeInhibit) {
- if (func == bitset)
- CursorSave(termw);
- else
- CursorRestore(termw);
- }
- break;
- case 1051:
- set_keyboard_type(keyboardIsSun, func == bitset);
- break;
-#if OPT_HP_FUNC_KEYS
- case 1052:
- set_keyboard_type(keyboardIsHP, func == bitset);
- break;
-#endif
-#if OPT_SCO_FUNC_KEYS
- case 1053:
- set_keyboard_type(keyboardIsSCO, func == bitset);
- break;
-#endif
- case 1060:
- set_keyboard_type(keyboardIsLegacy, func == bitset);
- break;
-#if OPT_SUNPC_KBD
- case 1061:
- set_keyboard_type(keyboardIsVT220, func == bitset);
- break;
-#endif
-#if OPT_READLINE
- case SET_BUTTON1_MOVE_POINT:
- set_mouseflag(click1_moves);
- break;
- case SET_BUTTON2_MOVE_POINT:
- set_mouseflag(paste_moves);
- break;
- case SET_DBUTTON3_DELETE:
- set_mouseflag(dclick3_deletes);
- break;
- case SET_PASTE_IN_BRACKET:
- set_mouseflag(paste_brackets);
- break;
- case SET_PASTE_QUOTE:
- set_mouseflag(paste_quotes);
- break;
- case SET_PASTE_LITERAL_NL:
- set_mouseflag(paste_literal_nl);
- break;
-#endif /* OPT_READLINE */
- }
- }
-}
-
-/*
- * process xterm private modes save
- */
-static void
-savemodes(XtermWidget termw)
-{
- TScreen *screen = &termw->screen;
- int i;
-
- for (i = 0; i < nparam; i++) {
- TRACE(("savemodes %d\n", param[i]));
- switch (param[i]) {
- case 1: /* DECCKM */
- DoSM(DP_DECCKM, termw->keyboard.flags & MODE_DECCKM);
- break;
- case 3: /* DECCOLM */
- if (screen->c132)
- DoSM(DP_DECCOLM, termw->flags & IN132COLUMNS);
- break;
- case 4: /* DECSCLM (slow scroll) */
- DoSM(DP_DECSCLM, termw->flags & SMOOTHSCROLL);
- break;
- case 5: /* DECSCNM */
- DoSM(DP_DECSCNM, termw->flags & REVERSE_VIDEO);
- break;
- case 6: /* DECOM */
- DoSM(DP_DECOM, termw->flags & ORIGIN);
- break;
-
- case 7: /* DECAWM */
- DoSM(DP_DECAWM, termw->flags & WRAPAROUND);
- break;
- case 8: /* DECARM */
- /* ignore autorepeat */
- break;
- case SET_X10_MOUSE: /* mouse bogus sequence */
- DoSM(DP_X_X10MSE, screen->send_mouse_pos);
- break;
-#if OPT_TOOLBAR
- case 10: /* rxvt */
- DoSM(DP_TOOLBAR, resource.toolBar);
- break;
-#endif
-#if OPT_BLINK_CURS
- case 12: /* att610: Start/stop blinking cursor */
- if (screen->cursor_blink_res) {
- DoSM(DP_CRS_BLINK, screen->cursor_blink_esc);
- }
- break;
-#endif
- case 18: /* DECPFF: print form feed */
- DoSM(DP_PRN_FORMFEED, screen->printer_formfeed);
- break;
- case 19: /* DECPEX: print extent */
- DoSM(DP_PRN_EXTENT, screen->printer_extent);
- break;
- case 25: /* DECTCEM: Show/hide cursor (VT200) */
- DoSM(DP_CRS_VISIBLE, screen->cursor_set);
- break;
- case 40: /* 132 column mode */
- DoSM(DP_X_DECCOLM, screen->c132);
- break;
- case 41: /* curses hack */
- DoSM(DP_X_MORE, screen->curses);
- break;
- case 44: /* margin bell */
- DoSM(DP_X_MARGIN, screen->marginbell);
- break;
- case 45: /* reverse wraparound */
- DoSM(DP_X_REVWRAP, termw->flags & REVERSEWRAP);
- break;
-#ifdef ALLOWLOGGING
- case 46: /* logging */
- DoSM(DP_X_LOGGING, screen->logging);
- break;
-#endif
- case 1047: /* alternate buffer */
- /* FALLTHRU */
- case 47: /* alternate buffer */
- DoSM(DP_X_ALTSCRN, screen->alternate);
- break;
- case SET_VT200_MOUSE: /* mouse bogus sequence */
- case SET_VT200_HIGHLIGHT_MOUSE:
- case SET_BTN_EVENT_MOUSE:
- case SET_ANY_EVENT_MOUSE:
- DoSM(DP_X_MOUSE, screen->send_mouse_pos);
- break;
- case 1048:
- if (!termw->misc.titeInhibit) {
- CursorSave(termw);
- }
- break;
-#if OPT_READLINE
- case SET_BUTTON1_MOVE_POINT:
- SCREEN_FLAG_save(screen, click1_moves);
- break;
- case SET_BUTTON2_MOVE_POINT:
- SCREEN_FLAG_save(screen, paste_moves);
- break;
- case SET_DBUTTON3_DELETE:
- SCREEN_FLAG_save(screen, dclick3_deletes);
- break;
- case SET_PASTE_IN_BRACKET:
- SCREEN_FLAG_save(screen, paste_brackets);
- break;
- case SET_PASTE_QUOTE:
- SCREEN_FLAG_save(screen, paste_quotes);
- break;
- case SET_PASTE_LITERAL_NL:
- SCREEN_FLAG_save(screen, paste_literal_nl);
- break;
-#endif /* OPT_READLINE */
- }
- }
-}
-
-/*
- * process xterm private modes restore
- */
-static void
-restoremodes(XtermWidget termw)
-{
- TScreen *screen = &termw->screen;
- int i, j;
-
- for (i = 0; i < nparam; i++) {
- TRACE(("restoremodes %d\n", param[i]));
- switch (param[i]) {
- case 1: /* DECCKM */
- bitcpy(&termw->keyboard.flags,
- screen->save_modes[DP_DECCKM], MODE_DECCKM);
- update_appcursor();
- break;
- case 3: /* DECCOLM */
- if (screen->c132) {
- ClearScreen(screen);
- CursorSet(screen, 0, 0, termw->flags);
- if ((j = (screen->save_modes[DP_DECCOLM] & IN132COLUMNS)
- ? 132 : 80) != ((termw->flags & IN132COLUMNS)
- ? 132 : 80) || j != MaxCols(screen))
- RequestResize(termw, -1, j, True);
- bitcpy(&termw->flags,
- screen->save_modes[DP_DECCOLM],
- IN132COLUMNS);
- }
- break;
- case 4: /* DECSCLM (slow scroll) */
- if (screen->save_modes[DP_DECSCLM] & SMOOTHSCROLL) {
- screen->jumpscroll = 0;
- if (screen->scroll_amt)
- FlushScroll(screen);
- } else
- screen->jumpscroll = 1;
- bitcpy(&termw->flags, screen->save_modes[DP_DECSCLM], SMOOTHSCROLL);
- update_jumpscroll();
- break;
- case 5: /* DECSCNM */
- if ((screen->save_modes[DP_DECSCNM] ^ termw->flags) & REVERSE_VIDEO) {
- bitcpy(&termw->flags, screen->save_modes[DP_DECSCNM], REVERSE_VIDEO);
- ReverseVideo(termw);
- /* update_reversevideo done in RevVid */
- }
- break;
- case 6: /* DECOM */
- bitcpy(&termw->flags, screen->save_modes[DP_DECOM], ORIGIN);
- CursorSet(screen, 0, 0, termw->flags);
- break;
-
- case 7: /* DECAWM */
- bitcpy(&termw->flags, screen->save_modes[DP_DECAWM], WRAPAROUND);
- update_autowrap();
- break;
- case 8: /* DECARM */
- /* ignore autorepeat */
- break;
- case SET_X10_MOUSE: /* MIT bogus sequence */
- DoRM(DP_X_X10MSE, screen->send_mouse_pos);
- break;
-#if OPT_TOOLBAR
- case 10: /* rxvt */
- DoRM(DP_TOOLBAR, resource.toolBar);
- ShowToolbar(resource.toolBar);
- break;
-#endif
-#if OPT_BLINK_CURS
- case 12: /* att610: Start/stop blinking cursor */
- if (screen->cursor_blink_res) {
- DoRM(DP_CRS_BLINK, screen->cursor_blink_esc);
- SetCursorBlink(screen, screen->cursor_blink);
- }
- break;
-#endif
- case 18: /* DECPFF: print form feed */
- DoRM(DP_PRN_FORMFEED, screen->printer_formfeed);
- break;
- case 19: /* DECPEX: print extent */
- DoRM(DP_PRN_EXTENT, screen->printer_extent);
- break;
- case 25: /* DECTCEM: Show/hide cursor (VT200) */
- DoRM(DP_CRS_VISIBLE, screen->cursor_set);
- break;
- case 40: /* 132 column mode */
- DoRM(DP_X_DECCOLM, screen->c132);
- update_allow132();
- break;
- case 41: /* curses hack */
- DoRM(DP_X_MORE, screen->curses);
- update_cursesemul();
- break;
- case 44: /* margin bell */
- if ((DoRM(DP_X_MARGIN, screen->marginbell)) == 0)
- screen->bellarmed = -1;
- update_marginbell();
- break;
- case 45: /* reverse wraparound */
- bitcpy(&termw->flags, screen->save_modes[DP_X_REVWRAP], REVERSEWRAP);
- update_reversewrap();
- break;
-#ifdef ALLOWLOGGING
- case 46: /* logging */
-#ifdef ALLOWLOGFILEONOFF
- if (screen->save_modes[DP_X_LOGGING])
- StartLog(screen);
- else
- CloseLog(screen);
-#endif /* ALLOWLOGFILEONOFF */
- /* update_logging done by StartLog and CloseLog */
- break;
-#endif
- case 1047: /* alternate buffer */
- /* FALLTHRU */
- case 47: /* alternate buffer */
- if (!termw->misc.titeInhibit) {
- if (screen->save_modes[DP_X_ALTSCRN])
- ToAlternate(screen);
- else
- FromAlternate(screen);
- /* update_altscreen done by ToAlt and FromAlt */
- } else if (termw->misc.tiXtraScroll) {
- if (screen->save_modes[DP_X_ALTSCRN]) {
- xtermScroll(screen, screen->max_row);
- }
- }
- break;
- case SET_VT200_MOUSE: /* mouse bogus sequence */
- case SET_VT200_HIGHLIGHT_MOUSE:
- case SET_BTN_EVENT_MOUSE:
- case SET_ANY_EVENT_MOUSE:
- DoRM(DP_X_MOUSE, screen->send_mouse_pos);
- break;
- case 1048:
- if (!termw->misc.titeInhibit) {
- CursorRestore(termw);
- }
- break;
-#if OPT_READLINE
- case SET_BUTTON1_MOVE_POINT:
- SCREEN_FLAG_restore(screen, click1_moves);
- break;
- case SET_BUTTON2_MOVE_POINT:
- SCREEN_FLAG_restore(screen, paste_moves);
- break;
- case SET_DBUTTON3_DELETE:
- SCREEN_FLAG_restore(screen, dclick3_deletes);
- break;
- case SET_PASTE_IN_BRACKET:
- SCREEN_FLAG_restore(screen, paste_brackets);
- break;
- case SET_PASTE_QUOTE:
- SCREEN_FLAG_restore(screen, paste_quotes);
- break;
- case SET_PASTE_LITERAL_NL:
- SCREEN_FLAG_restore(screen, paste_literal_nl);
- break;
-#endif /* OPT_READLINE */
- }
- }
-}
-
-/*
- * Report window label (icon or title) in dtterm protocol
- * ESC ] code label ESC backslash
- */
-static void
-report_win_label(TScreen * screen,
- int code,
- XTextProperty * text,
- Status ok)
-{
- char **list;
- int length = 0;
-
- reply.a_type = ESC;
- unparseputc(ESC, screen->respond);
- unparseputc(']', screen->respond);
- unparseputc(code, screen->respond);
-
- if (ok) {
- if (XTextPropertyToStringList(text, &list, &length)) {
- int n, c;
- for (n = 0; n < length; n++) {
- char *s = list[n];
- while ((c = *s++) != '\0')
- unparseputc(c, screen->respond);
- }
- XFreeStringList(list);
- }
- if (text->value != 0)
- XFree(text->value);
- }
-
- unparseputc(ESC, screen->respond);
- unparseputc('\\', screen->respond);
-}
-
-/*
- * Window operations (from CDE dtterm description, as well as extensions).
- * See also "allowWindowOps" resource.
- */
-static void
-window_ops(XtermWidget termw)
-{
- TScreen *screen = &termw->screen;
- XWindowChanges values;
- XWindowAttributes win_attrs;
- XTextProperty text;
- unsigned value_mask;
- unsigned root_width;
- unsigned root_height;
-
- TRACE(("window_ops %d\n", param[0]));
- switch (param[0]) {
- case 1: /* Restore (de-iconify) window */
- XMapWindow(screen->display,
- VShellWindow);
- break;
-
- case 2: /* Minimize (iconify) window */
- XIconifyWindow(screen->display,
- VShellWindow,
- DefaultScreen(screen->display));
- break;
-
- case 3: /* Move the window to the given position */
- values.x = param[1];
- values.y = param[2];
- value_mask = (CWX | CWY);
- XReconfigureWMWindow(screen->display,
- VShellWindow,
- DefaultScreen(screen->display),
- value_mask,
- &values);
- break;
-
- case 4: /* Resize the window to given size in pixels */
- RequestResize(termw, param[1], param[2], False);
- break;
-
- case 5: /* Raise the window to the front of the stack */
- XRaiseWindow(screen->display, VShellWindow);
- break;
-
- case 6: /* Lower the window to the bottom of the stack */
- XLowerWindow(screen->display, VShellWindow);
- break;
-
- case 7: /* Refresh the window */
- Redraw();
- break;
-
- case 8: /* Resize the text-area, in characters */
- RequestResize(termw, param[1], param[2], True);
- break;
-
-#if OPT_MAXIMIZE
- case 9: /* Maximize or restore */
- RequestMaximize(termw, param[1]);
- break;
-#endif
-
- case 11: /* Report the window's state */
- XGetWindowAttributes(screen->display,
- VWindow(screen),
- &win_attrs);
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 1;
- reply.a_param[0] = (win_attrs.map_state == IsViewable) ? 1 : 2;
- reply.a_inters = 0;
- reply.a_final = 't';
- unparseseq(&reply, screen->respond);
- break;
-
- case 13: /* Report the window's position */
- XGetWindowAttributes(screen->display,
- WMFrameWindow(termw),
- &win_attrs);
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 3;
- reply.a_param[0] = 3;
- reply.a_param[1] = win_attrs.x;
- reply.a_param[2] = win_attrs.y;
- reply.a_inters = 0;
- reply.a_final = 't';
- unparseseq(&reply, screen->respond);
- break;
-
- case 14: /* Report the window's size in pixels */
- XGetWindowAttributes(screen->display,
- VWindow(screen),
- &win_attrs);
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 3;
- reply.a_param[0] = 4;
- /*FIXME: find if dtterm uses
- * win_attrs.height or Height
- * win_attrs.width or Width
- */
- reply.a_param[1] = Height(screen);
- reply.a_param[2] = Width(screen);
- reply.a_inters = 0;
- reply.a_final = 't';
- unparseseq(&reply, screen->respond);
- break;
-
- case 18: /* Report the text's size in characters */
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 3;
- reply.a_param[0] = 8;
- reply.a_param[1] = MaxRows(screen);
- reply.a_param[2] = MaxCols(screen);
- reply.a_inters = 0;
- reply.a_final = 't';
- unparseseq(&reply, screen->respond);
- break;
-
-#if OPT_MAXIMIZE
- case 19: /* Report the screen's size, in characters */
- if (!QueryMaximize(term, &root_height, &root_width)) {
- root_height = 0;
- root_width = 0;
- }
- reply.a_type = CSI;
- reply.a_pintro = 0;
- reply.a_nparam = 3;
- reply.a_param[0] = 9;
- reply.a_param[1] = root_height / FontHeight(screen);
- reply.a_param[2] = root_width / FontWidth(screen);
- reply.a_inters = 0;
- reply.a_final = 't';
- unparseseq(&reply, screen->respond);
- break;
-#endif
-
- case 20: /* Report the icon's label */
- report_win_label(screen, 'L', &text,
- XGetWMIconName(screen->display, VShellWindow, &text));
- break;
-
- case 21: /* Report the window's title */
- report_win_label(screen, 'l', &text,
- XGetWMName(screen->display, VShellWindow, &text));
- break;
-
- default: /* DECSLPP (24, 25, 36, 48, 72, 144) */
- if (param[0] >= 24)
- RequestResize(termw, param[0], -1, True);
- break;
- }
-}
-
-/*
- * set a bit in a word given a pointer to the word and a mask.
- */
-static void
-bitset(unsigned *p, unsigned mask)
-{
- *p |= mask;
-}
-
-/*
- * clear a bit in a word given a pointer to the word and a mask.
- */
-static void
-bitclr(unsigned *p, unsigned mask)
-{
- *p &= ~mask;
-}
-
-/*
- * Copy bits from one word to another, given a mask
- */
-static void
-bitcpy(unsigned *p, unsigned q, unsigned mask)
-{
- bitclr(p, mask);
- bitset(p, q & mask);
-}
-
-void
-unparseputc1(int c, int fd)
-{
- if (c >= 0x80 && c <= 0x9F) {
- if (!term->screen.control_eight_bits) {
- unparseputc(A2E(ESC), fd);
- c = A2E(c - 0x40);
- }
- }
- unparseputc(c, fd);
-}
-
-void
-unparseseq(ANSI * ap, int fd)
-{
- int c;
- int i;
- int inters;
-
- unparseputc1(c = ap->a_type, fd);
- if (c == ESC
- || c == DCS
- || c == CSI
- || c == OSC
- || c == PM
- || c == APC
- || c == SS3) {
- if (ap->a_pintro != 0)
- unparseputc(ap->a_pintro, fd);
- for (i = 0; i < ap->a_nparam; ++i) {
- if (i != 0)
- unparseputc(';', fd);
- unparseputn((unsigned int) ap->a_param[i], fd);
- }
- if ((inters = ap->a_inters) != 0) {
- for (i = 3; i >= 0; --i) {
- c = CharOf(inters >> (8 * i));
- if (c != 0)
- unparseputc(c, fd);
- }
- }
- unparseputc((char) ap->a_final, fd);
- }
-}
-
-static void
-unparseputn(unsigned int n, int fd)
-{
- unsigned int q;
-
- q = n / 10;
- if (q != 0)
- unparseputn(q, fd);
- unparseputc((char) ('0' + (n % 10)), fd);
-}
-
-void
-unparseputc(int c, int fd)
-{
- IChar buf[2];
- unsigned i = 1;
-
-#if OPT_TCAP_QUERY
- /*
- * If we're returning a termcap string, it has to be translated since
- * a DCS must not contain any characters except for the normal 7-bit
- * printable ASCII (counting tab, carriage return, etc). For now,
- * just use hexadecimal for the whole thing.
- */
- if (term->screen.tc_query >= 0) {
- char tmp[3];
- sprintf(tmp, "%02X", c & 0xFF);
- buf[0] = tmp[0];
- buf[1] = tmp[1];
- i = 2;
- } else
-#endif
- if ((buf[0] = c) == '\r' && (term->flags & LINEFEED)) {
- buf[1] = '\n';
- i++;
- }
-#ifdef VMS
- tt_write(&buf, i);
-#else /* VMS */
- writePtyData(fd, buf, i);
-#endif /* VMS */
-
- /* If send/receive mode is reset, we echo characters locally */
- if ((term->keyboard.flags & MODE_SRM) == 0) {
- (void) doparsing((unsigned) c, &myState);
- }
-}
-
-void
-unparseputs(char *s, int fd)
-{
- while (*s)
- unparseputc(*s++, fd);
-}
-
-void
-ToggleAlternate(TScreen * screen)
-{
- if (screen->alternate)
- FromAlternate(screen);
- else
- ToAlternate(screen);
-}
-
-static void
-ToAlternate(TScreen * screen)
-{
- if (screen->alternate)
- return;
- TRACE(("ToAlternate\n"));
- if (!screen->altbuf)
- screen->altbuf = Allocate(MaxRows(screen), MaxCols(screen),
- &screen->abuf_address);
- SwitchBufs(screen);
- screen->alternate = True;
- update_altscreen();
-}
-
-static void
-FromAlternate(TScreen * screen)
-{
- if (!screen->alternate)
- return;
- TRACE(("FromAlternate\n"));
- if (screen->scroll_amt)
- FlushScroll(screen);
- screen->alternate = False;
- SwitchBufs(screen);
- update_altscreen();
-}
-
-static void
-SwitchBufs(TScreen * screen)
-{
- int rows, top;
-
- if (screen->cursor_state)
- HideCursor();
-
- rows = MaxRows(screen);
- SwitchBufPtrs(screen);
-
- if ((top = -screen->topline) < rows) {
- if (screen->scroll_amt)
- FlushScroll(screen);
- if (top == 0)
- XClearWindow(screen->display, VWindow(screen));
- else
- XClearArea(screen->display,
- VWindow(screen),
- (int) OriginX(screen),
- (int) top * FontHeight(screen) + screen->border,
- (unsigned) Width(screen),
- (unsigned) (rows - top) * FontHeight(screen),
- False);
- }
- ScrnUpdate(screen, 0, 0, rows, MaxCols(screen), False);
-}
-
-/* swap buffer line pointers between alt and regular screens */
-void
-SwitchBufPtrs(TScreen * screen)
-{
- size_t len = ScrnPointers(screen, (unsigned) MaxRows(screen));
-
- memcpy((char *) screen->save_ptr, (char *) screen->visbuf, len);
- memcpy((char *) screen->visbuf, (char *) screen->altbuf, len);
- memcpy((char *) screen->altbuf, (char *) screen->save_ptr, len);
-}
-
-void
-VTRun(void)
-{
- TScreen *screen = &term->screen;
-
- TRACE(("VTRun ...\n"));
-
- if (!screen->Vshow) {
- set_vt_visibility(True);
- }
- update_vttekmode();
- update_vtshow();
- update_tekshow();
- set_vthide_sensitivity();
-
- if (screen->allbuf == NULL)
- VTallocbuf();
-
- screen->cursor_state = OFF;
- screen->cursor_set = ON;
-#if OPT_BLINK_CURS
- if (DoStartBlinking(screen))
- StartBlinking(screen);
-#endif
-
-#if OPT_TEK4014
- if (Tpushb > Tpushback) {
- fillPtyData(screen, VTbuffer, (char *) Tpushback, Tpushb - Tpushback);
- Tpushb = Tpushback;
- }
-#endif
- if (!setjmp(VTend))
- VTparse();
- StopBlinking(screen);
- HideCursor();
- screen->cursor_set = OFF;
-}
-
-/*ARGSUSED*/
-static void
-VTExpose(Widget w GCC_UNUSED,
- XEvent * event,
- Region region GCC_UNUSED)
-{
- TScreen *screen = &term->screen;
-
-#ifdef DEBUG
- if (debug)
- fputs("Expose\n", stderr);
-#endif /* DEBUG */
- if (event->type == Expose)
- HandleExposure(screen, event);
-}
-
-static void
-VTGraphicsOrNoExpose(XEvent * event)
-{
- TScreen *screen = &term->screen;
- if (screen->incopy <= 0) {
- screen->incopy = 1;
- if (screen->scrolls > 0)
- screen->scrolls--;
- }
- if (event->type == GraphicsExpose)
- if (HandleExposure(screen, event))
- screen->cursor_state = OFF;
- if ((event->type == NoExpose)
- || ((XGraphicsExposeEvent *) event)->count == 0) {
- if (screen->incopy <= 0 && screen->scrolls > 0)
- screen->scrolls--;
- if (screen->scrolls)
- screen->incopy = -1;
- else
- screen->incopy = 0;
- }
-}
-
-/*ARGSUSED*/
-static void
-VTNonMaskableEvent(Widget w GCC_UNUSED,
- XtPointer closure GCC_UNUSED,
- XEvent * event,
- Boolean * cont GCC_UNUSED)
-{
- switch (event->type) {
- case GraphicsExpose:
- case NoExpose:
- VTGraphicsOrNoExpose(event);
- break;
- }
-}
-
-static void
-VTResize(Widget w)
-{
- if (XtIsRealized(w)) {
- ScreenResize(&term->screen, term->core.width, term->core.height, &term->flags);
- }
-}
-
-#define okDimension(src,dst) ((src <= 32767) && ((dst = src) == src))
-
-static void
-RequestResize(XtermWidget termw, int rows, int cols, int text)
-{
-#ifndef nothack
- XSizeHints sizehints;
- long supp;
-#endif
- TScreen *screen = &termw->screen;
- unsigned long value;
- Dimension replyWidth, replyHeight;
- Dimension askedWidth, askedHeight;
- XtGeometryResult status;
- XWindowAttributes attrs;
-
- TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text));
-
- if ((askedWidth = cols) < cols
- || (askedHeight = rows) < rows)
- return;
-
- if (askedHeight == 0
- || askedWidth == 0
- || term->misc.limit_resize > 0) {
- XGetWindowAttributes(XtDisplay(termw),
- RootWindowOfScreen(XtScreen(termw)), &attrs);
- }
-
- if (text) {
- if ((value = rows) != 0) {
- if (rows < 0)
- value = MaxRows(screen);
- value *= FontHeight(screen);
- value += (2 * screen->border);
- if (!okDimension(value, askedHeight))
- return;
- }
-
- if ((value = cols) != 0) {
- if (cols < 0)
- value = MaxCols(screen);
- value *= FontWidth(screen);
- value += (2 * screen->border) + ScrollbarWidth(screen);
- if (!okDimension(value, askedWidth))
- return;
- }
-
- } else {
- if (rows < 0)
- askedHeight = FullHeight(screen);
- if (cols < 0)
- askedWidth = FullWidth(screen);
- }
-
- if (rows == 0)
- askedHeight = attrs.height;
- if (cols == 0)
- askedWidth = attrs.width;
-
- if (term->misc.limit_resize > 0) {
- Dimension high = term->misc.limit_resize * attrs.height;
- Dimension wide = term->misc.limit_resize * attrs.width;
- if (high < attrs.height)
- high = attrs.height;
- if (askedHeight > high)
- askedHeight = high;
- if (wide < attrs.width)
- wide = attrs.width;
- if (askedWidth > wide)
- askedWidth = wide;
- }
-#ifndef nothack
- if (!XGetWMNormalHints(screen->display, VShellWindow,
- &sizehints, &supp))
- bzero(&sizehints, sizeof(sizehints));
-#endif
-
- status = XtMakeResizeRequest((Widget) termw,
- askedWidth, askedHeight,
- &replyWidth, &replyHeight);
- TRACE(("charproc.c XtMakeResizeRequest %dx%d -> %dx%d (status %d)\n",
- askedHeight, askedWidth,
- replyHeight, replyWidth,
- status));
-
- if (status == XtGeometryYes ||
- status == XtGeometryDone) {
- ScreenResize(&termw->screen,
- replyWidth,
- replyHeight,
- &termw->flags);
- }
-#ifndef nothack
- /*
- * XtMakeResizeRequest() has the undesirable side-effect of clearing
- * the window manager's hints, even on a failed request. This would
- * presumably be fixed if the shell did its own work.
- */
- if (sizehints.flags
- && replyHeight
- && replyWidth) {
- sizehints.height = replyHeight;
- sizehints.width = replyWidth;
-
- TRACE(("%s@%d -- ", __FILE__, __LINE__));
- TRACE_HINTS(&sizehints);
- XSetWMNormalHints(screen->display, VShellWindow, &sizehints);
- TRACE(("%s@%d -- ", __FILE__, __LINE__));
- TRACE_WM_HINTS(termw);
- }
-#endif
-
- XSync(screen->display, False); /* synchronize */
- if (XtAppPending(app_con))
- xevents();
-}
-
-static String xterm_trans =
-"<ClientMessage>WM_PROTOCOLS: DeleteWindow()\n\
- <MappingNotify>: KeyboardMapping()\n";
-
-int
-VTInit(void)
-{
- TScreen *screen = &term->screen;
- Widget vtparent = SHELL_OF(term);
-
- XtRealizeWidget(vtparent);
- XtOverrideTranslations(vtparent, XtParseTranslationTable(xterm_trans));
- (void) XSetWMProtocols(XtDisplay(vtparent), XtWindow(vtparent),
- &wm_delete_window, 1);
- TRACE_TRANS("shell", vtparent);
- TRACE_TRANS("vt100", (Widget) (term));
-
- if (screen->allbuf == NULL)
- VTallocbuf();
- return (1);
-}
-
-static void
-VTallocbuf(void)
-{
- TScreen *screen = &term->screen;
- int nrows = MaxRows(screen);
-
- /* allocate screen buffer now, if necessary. */
- if (screen->scrollWidget)
- nrows += screen->savelines;
- screen->allbuf = Allocate(nrows, MaxCols(screen),
- &screen->sbuf_address);
- if (screen->scrollWidget)
- screen->visbuf = &screen->allbuf[MAX_PTRS * screen->savelines];
- else
- screen->visbuf = screen->allbuf;
- return;
-}
-
-static void
-VTClassInit(void)
-{
- XtAddConverter(XtRString, XtRGravity, XmuCvtStringToGravity,
- (XtConvertArgList) NULL, (Cardinal) 0);
-}
-
-/*
- * The whole wnew->screen struct is zeroed in VTInitialize. Use these macros
- * where applicable for copying the pieces from the request widget into the
- * new widget. We do not have to use them for wnew->misc, but the associated
- * traces are very useful for debugging.
- */
-#if OPT_TRACE
-#define init_Bres(name) \
- TRACE(("init " #name " = %s\n", \
- BtoS(wnew->name = request->name)))
-#define init_Dres(name) \
- TRACE(("init " #name " = %f\n", \
- wnew->name = request->name))
-#define init_Ires(name) \
- TRACE(("init " #name " = %d\n", \
- wnew->name = request->name))
-#define init_Sres(name) \
- TRACE(("init " #name " = \"%s\"\n", \
- (wnew->name = x_strtrim(request->name)) != NULL \
- ? wnew->name : "<null>"))
-#define init_Tres(offset) \
- TRACE(("init screen.Tcolors[" #offset "] = %#lx\n", \
- fill_Tres(wnew, request, offset)))
-#else
-#define init_Bres(name) wnew->name = request->name
-#define init_Dres(name) wnew->name = request->name
-#define init_Ires(name) wnew->name = request->name
-#define init_Sres(name) wnew->name = x_strtrim(request->name)
-#define init_Tres(offset) fill_Tres(wnew, request, offset)
-#endif
-
-#if OPT_COLOR_RES
-/*
- * Override the use of XtDefaultForeground/XtDefaultBackground to make some
- * colors, such as cursor color, use the actual foreground/background value
- * if there is no explicit resource value used.
- */
-static Pixel
-fill_Tres(XtermWidget target, XtermWidget source, int offset)
-{
- char *name;
- ScrnColors temp;
-
- target->screen.Tcolors[offset] = source->screen.Tcolors[offset];
- target->screen.Tcolors[offset].mode = False;
-
- if ((name = x_strtrim(target->screen.Tcolors[offset].resource)) != 0)
- target->screen.Tcolors[offset].resource = name;
-
- if (name == 0) {
- target->screen.Tcolors[offset].value = target->dft_foreground;
- } else if (!x_strcasecmp(name, XtDefaultForeground)) {
- target->screen.Tcolors[offset].value =
- ((offset == TEXT_FG || offset == TEXT_BG)
- ? target->dft_foreground
- : target->screen.Tcolors[TEXT_FG].value);
- } else if (!x_strcasecmp(name, XtDefaultBackground)) {
- target->screen.Tcolors[offset].value =
- ((offset == TEXT_FG || offset == TEXT_BG)
- ? target->dft_background
- : target->screen.Tcolors[TEXT_BG].value);
- } else {
- if (AllocateTermColor(target, &temp, offset, name)) {
- target->screen.Tcolors[offset].value = temp.colors[offset];
- }
- }
- return target->screen.Tcolors[offset].value;
-}
-#else
-#define fill_Tres(target, source, offset) \
- target->screen.Tcolors[offset] = source->screen.Tcolors[offset]
-#endif
-
-#if OPT_WIDE_CHARS
-static void
-VTInitialize_locale(XtermWidget request)
-{
- Bool is_utf8 = xtermEnvUTF8();
-
- TRACE(("VTInitialize_locale\n"));
- TRACE(("... request screen.utf8_mode = %d\n", request->screen.utf8_mode));
-
- if (request->screen.utf8_mode < 0)
- request->screen.utf8_mode = uFalse;
-
- if (request->screen.utf8_mode > 3)
- request->screen.utf8_mode = uDefault;
-
- request->screen.latin9_mode = 0;
- request->screen.unicode_font = 0;
-#if OPT_LUIT_PROG
- request->misc.callfilter = 0;
- request->misc.use_encoding = 0;
-
- TRACE(("... setup for luit:\n"));
- TRACE(("... request misc.locale_str = \"%s\"\n", request->misc.locale_str));
-
- if (request->screen.utf8_mode == uFalse) {
- TRACE(("... command-line +u8 overrides\n"));
- } else
-#if OPT_MINI_LUIT
- if (x_strcasecmp(request->misc.locale_str, "CHECKFONT") == 0) {
- int fl = (request->misc.default_font.f_n
- ? strlen(request->misc.default_font.f_n)
- : 0);
- if (fl > 11
- && x_strcasecmp(request->misc.default_font.f_n + fl - 11,
- "-ISO10646-1") == 0) {
- request->screen.unicode_font = 1;
- /* unicode font, use True */
-#ifdef HAVE_LANGINFO_CODESET
- if (!strcmp(xtermEnvEncoding(), "ANSI_X3.4-1968")
- || !strcmp(xtermEnvEncoding(), "ISO-8859-1")) {
- if (request->screen.utf8_mode == uDefault)
- request->screen.utf8_mode = uFalse;
- } else if (!strcmp(xtermEnvEncoding(), "ISO-8859-15")) {
- if (request->screen.utf8_mode == uDefault)
- request->screen.utf8_mode = uFalse;
- request->screen.latin9_mode = 1;
- } else {
- request->misc.callfilter = is_utf8 ? 0 : 1;
- request->screen.utf8_mode = uAlways;
- }
-#else
- request->misc.callfilter = is_utf8 ? 0 : 1;
- request->screen.utf8_mode = uAlways;
-#endif
- } else {
- /* other encoding, use False */
- if (request->screen.utf8_mode == uDefault) {
- request->screen.utf8_mode = is_utf8 ? uAlways : uFalse;
- }
- }
- } else
-#endif /* OPT_MINI_LUIT */
- if (x_strcasecmp(request->misc.locale_str, "TRUE") == 0 ||
- x_strcasecmp(request->misc.locale_str, "ON") == 0 ||
- x_strcasecmp(request->misc.locale_str, "YES") == 0 ||
- x_strcasecmp(request->misc.locale_str, "AUTO") == 0 ||
- strcmp(request->misc.locale_str, "1") == 0) {
- /* when true ... fully obeying LC_CTYPE locale */
- request->misc.callfilter = is_utf8 ? 0 : 1;
- request->screen.utf8_mode = uAlways;
- } else if (x_strcasecmp(request->misc.locale_str, "FALSE") == 0 ||
- x_strcasecmp(request->misc.locale_str, "OFF") == 0 ||
- x_strcasecmp(request->misc.locale_str, "NO") == 0 ||
- strcmp(request->misc.locale_str, "0") == 0) {
- /* when false ... original value of utf8_mode is effective */
- if (request->screen.utf8_mode == uDefault) {
- request->screen.utf8_mode = is_utf8 ? uAlways : uFalse;
- }
- } else if (x_strcasecmp(request->misc.locale_str, "MEDIUM") == 0 ||
- x_strcasecmp(request->misc.locale_str, "SEMIAUTO") == 0) {
- /* when medium ... obeying locale only for UTF-8 and Asian */
- if (is_utf8) {
- request->screen.utf8_mode = uAlways;
- } else if (
-#ifdef MB_CUR_MAX
- MB_CUR_MAX > 1 ||
-#else
- !strncmp(xtermEnvLocale(), "ja", 2) ||
- !strncmp(xtermEnvLocale(), "ko", 2) ||
- !strncmp(xtermEnvLocale(), "zh", 2) ||
-#endif
- !strncmp(xtermEnvLocale(), "th", 2) ||
- !strncmp(xtermEnvLocale(), "vi", 2)) {
- request->misc.callfilter = 1;
- request->screen.utf8_mode = uAlways;
- } else {
- request->screen.utf8_mode = uFalse;
- }
- } else if (x_strcasecmp(request->misc.locale_str, "UTF-8") == 0 ||
- x_strcasecmp(request->misc.locale_str, "UTF8") == 0) {
- /* when UTF-8 ... UTF-8 mode */
- request->screen.utf8_mode = uAlways;
- } else {
- /* other words are regarded as encoding name passed to luit */
- request->misc.callfilter = 1;
- request->screen.utf8_mode = uAlways;
- request->misc.use_encoding = 1;
- }
- TRACE(("... updated misc.callfilter = %s\n", BtoS(request->misc.callfilter)));
- TRACE(("... updated misc.use_encoding = %s\n", BtoS(request->misc.use_encoding)));
-#else
- if (request->screen.utf8_mode == uDefault) {
- request->screen.utf8_mode = is_utf8 ? uAlways : uFalse;
- }
-#endif /* OPT_LUIT_PROG */
-
- request->screen.utf8_inparse = (request->screen.utf8_mode != uFalse);
-
- TRACE(("... updated screen.utf8_mode = %d\n", request->screen.utf8_mode));
- TRACE(("...VTInitialize_locale done\n"));
-}
-#endif
-
-/* ARGSUSED */
-static void
-VTInitialize(Widget wrequest,
- Widget new_arg,
- ArgList args GCC_UNUSED,
- Cardinal *num_args GCC_UNUSED)
-{
- XtermWidget request = (XtermWidget) wrequest;
- XtermWidget wnew = (XtermWidget) new_arg;
- Widget my_parent = SHELL_OF(wnew);
- int i;
- char *s;
-
-#if OPT_ISO_COLORS
- Bool color_ok;
-#endif
-
-#if OPT_COLOR_RES2 && (MAXCOLORS > MIN_ANSI_COLORS)
- static XtResource fake_resources[] =
- {
-#if OPT_256_COLORS
-# include <256colres.h>
-#elif OPT_88_COLORS
-# include <88colres.h>
-#endif
- };
-#endif /* OPT_COLOR_RES2 */
-
- TRACE(("VTInitialize\n"));
-
- /* Zero out the entire "screen" component of "wnew" widget, then do
- * field-by-field assignment of "screen" fields that are named in the
- * resource list.
- */
- bzero((char *) &wnew->screen, sizeof(wnew->screen));
-
- /* dummy values so that we don't try to Realize the parent shell with height
- * or width of 0, which is illegal in X. The real size is computed in the
- * xtermWidget's Realize proc, but the shell's Realize proc is called first,
- * and must see a valid size.
- */
- wnew->core.height = wnew->core.width = 1;
-
- /*
- * The definition of -rv now is that it changes the definition of
- * XtDefaultForeground and XtDefaultBackground. So, we no longer
- * need to do anything special.
- */
- wnew->screen.display = wnew->core.screen->display;
-
- /*
- * We use the default foreground/background colors to compare/check if a
- * color-resource has been set.
- */
-#define MyBlackPixel(dpy) BlackPixel(dpy,DefaultScreen(dpy))
-#define MyWhitePixel(dpy) WhitePixel(dpy,DefaultScreen(dpy))
-
- if (request->misc.re_verse) {
- wnew->dft_foreground = MyWhitePixel(wnew->screen.display);
- wnew->dft_background = MyBlackPixel(wnew->screen.display);
- } else {
- wnew->dft_foreground = MyBlackPixel(wnew->screen.display);
- wnew->dft_background = MyWhitePixel(wnew->screen.display);
- }
- init_Tres(TEXT_FG);
- init_Tres(TEXT_BG);
-
- TRACE(("Color resource initialization:\n"));
- TRACE((" Default foreground %#lx\n", wnew->dft_foreground));
- TRACE((" Default background %#lx\n", wnew->dft_background));
- TRACE((" Screen foreground %#lx\n", T_COLOR(&(wnew->screen), TEXT_FG)));
- TRACE((" Screen background %#lx\n", T_COLOR(&(wnew->screen), TEXT_BG)));
-
- wnew->screen.mouse_button = -1;
- wnew->screen.mouse_row = -1;
- wnew->screen.mouse_col = -1;
-
-#if OPT_BOX_CHARS
- init_Bres(screen.force_box_chars);
- init_Bres(screen.force_all_chars);
-#endif
- init_Bres(screen.free_bold_box);
-
- init_Bres(screen.c132);
- init_Bres(screen.curses);
- init_Bres(screen.hp_ll_bc);
-#if OPT_XMC_GLITCH
- init_Ires(screen.xmc_glitch);
- init_Ires(screen.xmc_attributes);
- init_Bres(screen.xmc_inline);
- init_Bres(screen.move_sgr_ok);
-#endif
-#if OPT_BLINK_CURS
- init_Bres(screen.cursor_blink);
- init_Ires(screen.blink_on);
- init_Ires(screen.blink_off);
- wnew->screen.cursor_blink_res = wnew->screen.cursor_blink;
-#endif
-#if OPT_BLINK_TEXT
- init_Ires(screen.blink_as_bold);
-#endif
- init_Ires(screen.border);
- init_Bres(screen.jumpscroll);
- init_Bres(screen.old_fkeys);
- init_Bres(screen.delete_is_del);
- wnew->keyboard.type = wnew->screen.old_fkeys
- ? keyboardIsLegacy
- : keyboardIsDefault;
-#ifdef ALLOWLOGGING
- init_Sres(screen.logfile);
-#endif
- init_Bres(screen.bellOnReset);
- init_Bres(screen.marginbell);
- init_Bres(screen.multiscroll);
- init_Ires(screen.nmarginbell);
- init_Ires(screen.savelines);
- init_Ires(screen.scrollBarBorder);
- init_Ires(screen.scrolllines);
- init_Bres(screen.scrollttyoutput);
- init_Bres(screen.scrollkey);
-
- init_Sres(screen.term_id);
- for (s = request->screen.term_id; *s; s++) {
- if (!isalpha(CharOf(*s)))
- break;
- }
- wnew->screen.terminal_id = atoi(s);
- if (wnew->screen.terminal_id < MIN_DECID)
- wnew->screen.terminal_id = MIN_DECID;
- if (wnew->screen.terminal_id > MAX_DECID)
- wnew->screen.terminal_id = MAX_DECID;
- TRACE(("term_id '%s' -> terminal_id %d\n",
- wnew->screen.term_id,
- wnew->screen.terminal_id));
-
- wnew->screen.vtXX_level = (wnew->screen.terminal_id / 100);
- init_Bres(screen.visualbell);
- init_Ires(screen.visualBellDelay);
- init_Bres(screen.poponbell);
- init_Ires(misc.limit_resize);
-#if OPT_NUM_LOCK
- init_Bres(misc.real_NumLock);
- init_Bres(misc.alwaysUseMods);
- wnew->misc.num_lock = 0;
- wnew->misc.alt_left = 0;
- wnew->misc.alt_right = 0;
- wnew->misc.meta_trans = False;
- wnew->misc.meta_left = 0;
- wnew->misc.meta_right = 0;
-#endif
-#if OPT_SHIFT_FONTS
- init_Bres(misc.shift_fonts);
-#endif
-#if OPT_SUNPC_KBD
- init_Ires(misc.ctrl_fkeys);
-#endif
-#if OPT_TEK4014
- init_Bres(misc.tekInhibit);
- init_Bres(misc.tekSmall);
- init_Bres(screen.TekEmu);
-#endif
-#if OPT_TCAP_QUERY
- wnew->screen.tc_query = -1;
-#endif
- wnew->misc.re_verse0 = request->misc.re_verse;
- init_Bres(misc.re_verse);
- init_Ires(screen.multiClickTime);
- init_Ires(screen.bellSuppressTime);
- init_Sres(screen.charClass);
- init_Bres(screen.cutNewline);
- init_Bres(screen.cutToBeginningOfLine);
- init_Bres(screen.highlight_selection);
- init_Bres(screen.trim_selection);
- init_Bres(screen.i18nSelections);
- init_Bres(screen.brokenSelections);
- init_Bres(screen.always_highlight);
- wnew->screen.pointer_cursor = request->screen.pointer_cursor;
-
- init_Sres(screen.answer_back);
-
- init_Sres(screen.printer_command);
- init_Bres(screen.printer_autoclose);
- init_Bres(screen.printer_extent);
- init_Bres(screen.printer_formfeed);
- init_Ires(screen.printer_controlmode);
-#if OPT_PRINT_COLORS
- init_Ires(screen.print_attributes);
-#endif
-
- init_Sres(screen.keyboard_dialect);
-
- init_Bres(screen.input_eight_bits);
- init_Bres(screen.output_eight_bits);
- init_Bres(screen.control_eight_bits);
- init_Bres(screen.backarrow_key);
- init_Bres(screen.meta_sends_esc);
-
- init_Bres(screen.allowSendEvent0);
- init_Bres(screen.allowWindowOp0);
-
- /* make a copy so that editres cannot change the resource after startup */
- wnew->screen.allowSendEvents = wnew->screen.allowSendEvent0;
- wnew->screen.allowWindowOps = wnew->screen.allowWindowOp0;
-
-#ifndef NO_ACTIVE_ICON
- wnew->screen.fnt_icon = request->screen.fnt_icon;
- init_Bres(misc.active_icon);
- init_Ires(misc.icon_border_width);
- wnew->misc.icon_border_pixel = request->misc.icon_border_pixel;
-#endif /* NO_ACTIVE_ICON */
- init_Bres(misc.titeInhibit);
- init_Bres(misc.tiXtraScroll);
- init_Bres(misc.dynamicColors);
- for (i = fontMenu_font1; i <= fontMenu_lastBuiltin; i++) {
- init_Sres(screen.MenuFontName(i));
- }
- /* set default in realize proc */
- wnew->screen.MenuFontName(fontMenu_fontdefault) = NULL;
- wnew->screen.MenuFontName(fontMenu_fontescape) = NULL;
- wnew->screen.MenuFontName(fontMenu_fontsel) = NULL;
- wnew->screen.menu_font_number = fontMenu_fontdefault;
-
-#if OPT_BROKEN_OSC
- init_Bres(screen.brokenLinuxOSC);
-#endif
-
-#if OPT_BROKEN_ST
- init_Bres(screen.brokenStringTerm);
-#endif
-
-#if OPT_C1_PRINT
- init_Bres(screen.c1_printable);
-#endif
-
-#if OPT_DEC_CHRSET
- init_Bres(screen.font_doublesize);
- init_Ires(screen.cache_doublesize);
- if (wnew->screen.cache_doublesize > NUM_CHRSET)
- wnew->screen.cache_doublesize = NUM_CHRSET;
- if (wnew->screen.cache_doublesize == 0)
- wnew->screen.font_doublesize = False;
- TRACE(("Doublesize%s enabled, up to %d fonts\n",
- wnew->screen.font_doublesize ? "" : " not",
- wnew->screen.cache_doublesize));
-#endif
-
-#if OPT_ISO_COLORS || OPT_DEC_CHRSET || OPT_WIDE_CHARS
- wnew->num_ptrs = (OFF_ATTRS + 1); /* OFF_FLAGS, OFF_CHARS, OFF_ATTRS */
-#endif
-#if OPT_ISO_COLORS
- init_Ires(screen.veryBoldColors);
- init_Bres(screen.boldColors);
- init_Bres(screen.colorAttrMode);
- init_Bres(screen.colorBDMode);
- init_Bres(screen.colorBLMode);
- init_Bres(screen.colorMode);
- init_Bres(screen.colorULMode);
- init_Bres(screen.italicULMode);
- init_Bres(screen.colorRVMode);
-
- for (i = 0, color_ok = False; i < MAXCOLORS; i++) {
-
-#if OPT_COLOR_RES2 && (MAXCOLORS > MIN_ANSI_COLORS)
- /*
- * Xt has a hardcoded limit on the maximum number of resources that can
- * be used in a widget. If we configure both luit (which implies
- * wide-characters) and 256-colors, it goes over that limit. Most
- * people would not need a resource-file with 256-colors; the default
- * values in our table are sufficient. In that case, fake the resource
- * setting by copying the default value from the table. The #define's
- * can be overridden to make these true resources.
- */
- if (i >= MIN_ANSI_COLORS && i < NUM_ANSI_COLORS) {
- wnew->screen.Acolors[i].resource
- = ((char *) fake_resources[i - MIN_ANSI_COLORS].default_addr);
- if (wnew->screen.Acolors[i].resource == 0)
- wnew->screen.Acolors[i].resource = XtDefaultForeground;
- } else
-#endif /* OPT_COLOR_RES2 */
- wnew->screen.Acolors[i] = request->screen.Acolors[i];
-
-#if OPT_COLOR_RES
- TRACE(("Acolors[%d] = %s\n", i, wnew->screen.Acolors[i].resource));
- wnew->screen.Acolors[i].mode = False;
- if (!x_strcasecmp(wnew->screen.Acolors[i].resource, XtDefaultForeground)) {
- wnew->screen.Acolors[i].value = T_COLOR(&(wnew->screen), TEXT_FG);
- wnew->screen.Acolors[i].mode = True;
- } else if (!x_strcasecmp(wnew->screen.Acolors[i].resource, XtDefaultBackground)) {
- wnew->screen.Acolors[i].value = T_COLOR(&(wnew->screen), TEXT_BG);
- wnew->screen.Acolors[i].mode = True;
- } else {
- color_ok = True;
- }
-#else
- TRACE(("Acolors[%d] = %#lx\n", i, request->screen.Acolors[i]));
- if (wnew->screen.Acolors[i] != wnew->dft_foreground &&
- wnew->screen.Acolors[i] != T_COLOR(&(wnew->screen), TEXT_FG) &&
- wnew->screen.Acolors[i] != T_COLOR(&(wnew->screen), TEXT_BG))
- color_ok = True;
-#endif
- }
-
- /*
- * Check if we're trying to use color in a monochrome screen. Disable
- * color in that case, since that would make ANSI colors unusable. A 4-bit
- * or 8-bit display is usable, so we do not have to check for anything more
- * specific.
- */
- if (color_ok) {
- Display *display = wnew->screen.display;
- XVisualInfo myTemplate, *visInfoPtr;
- int numFound;
-
- myTemplate.visualid = XVisualIDFromVisual(DefaultVisual(display,
- XDefaultScreen(display)));
- visInfoPtr = XGetVisualInfo(display, (long) VisualIDMask,
- &myTemplate, &numFound);
- if (visInfoPtr == 0
- || numFound == 0
- || visInfoPtr->depth <= 1) {
- TRACE(("disabling color since screen is monochrome\n"));
- color_ok = False;
- } else {
- XFree(visInfoPtr);
- }
- }
-
- /* If none of the colors are anything other than the foreground or
- * background, we'll assume this isn't color, no matter what the colorMode
- * resource says. (There doesn't seem to be any good way to determine if
- * the resource lookup failed versus the user having misconfigured this).
- */
- if (!color_ok) {
- wnew->screen.colorMode = False;
- TRACE(("All colors are foreground or background: disable colorMode\n"));
- }
-#if OPT_EXT_COLORS
- wnew->num_ptrs = (OFF_BGRND + 1);
-#else
- wnew->num_ptrs = (OFF_COLOR + 1);
-#endif
- wnew->sgr_foreground = -1;
- wnew->sgr_background = -1;
- wnew->sgr_extended = 0;
-#endif /* OPT_ISO_COLORS */
-
- init_Tres(MOUSE_FG);
- init_Tres(MOUSE_BG);
- init_Tres(TEXT_CURSOR);
-#if OPT_HIGHLIGHT_COLOR
- init_Tres(HIGHLIGHT_BG);
-#endif
-
-#if OPT_TEK4014
- /*
- * The Tek4014 window has no separate resources for foreground, background
- * and cursor color. Since xterm always creates the vt100 widget first, we
- * can set the Tektronix colors here. That lets us use escape sequences to
- * set its dynamic colors and get consistent behavior whether or not the
- * window is displayed.
- */
- T_COLOR(&(wnew->screen), TEK_BG) = T_COLOR(&(wnew->screen), TEXT_BG);
- T_COLOR(&(wnew->screen), TEK_FG) = T_COLOR(&(wnew->screen), TEXT_FG);
- T_COLOR(&(wnew->screen), TEK_CURSOR) = T_COLOR(&(wnew->screen), TEXT_CURSOR);
-#endif
-
-#if OPT_DEC_CHRSET
- wnew->num_ptrs = (OFF_CSETS + 1);
-#endif
-
-#if OPT_WIDE_CHARS
- VTInitialize_locale(request);
-
-#if OPT_LUIT_PROG
- init_Bres(misc.callfilter);
- init_Bres(misc.use_encoding);
- init_Sres(misc.locale_str);
- init_Sres(misc.localefilter);
-#endif
-
-#if OPT_RENDERFONT
- init_Dres(misc.face_size);
- init_Sres(misc.face_name);
- init_Sres(misc.face_wide_name);
- init_Bres(misc.render_font);
- /* minor tweak to make debug traces consistent: */
- if (wnew->misc.render_font) {
- if (wnew->misc.face_name == 0) {
- wnew->misc.render_font = False;
- TRACE(("reset render_font since there is no face_name\n"));
- }
- }
-#endif
-
- init_Bres(screen.vt100_graphics);
- init_Ires(screen.utf8_mode);
- init_Bres(screen.wide_chars);
- init_Bres(misc.mk_width);
- init_Bres(misc.cjk_width);
- if (request->screen.utf8_mode) {
- TRACE(("setting wide_chars on\n"));
- wnew->screen.wide_chars = True;
- } else {
- TRACE(("setting utf8_mode to 0\n"));
- wnew->screen.utf8_mode = uFalse;
- }
- TRACE(("initialized UTF-8 mode to %d\n", wnew->screen.utf8_mode));
-
-#if OPT_MINI_LUIT
- if (request->screen.latin9_mode) {
- wnew->screen.latin9_mode = True;
- }
- if (request->screen.unicode_font) {
- wnew->screen.unicode_font = True;
- }
- TRACE(("initialized Latin9 mode to %d\n", wnew->screen.latin9_mode));
- TRACE(("initialized unicode_font to %d\n", wnew->screen.unicode_font));
-#endif
-
- if (wnew->screen.wide_chars != False)
- wnew->num_ptrs = (OFF_COM2H + 1);
-
- decode_wcwidth((wnew->misc.cjk_width ? 2 : 0)
- + (wnew->misc.mk_width ? 1 : 0)
- + 1);
-#endif /* OPT_WIDE_CHARS */
-
- init_Bres(screen.bold_mode);
- init_Bres(screen.underline);
-
- wnew->cur_foreground = 0;
- wnew->cur_background = 0;
-
- wnew->keyboard.flags = MODE_SRM;
- if (wnew->screen.backarrow_key)
- wnew->keyboard.flags |= MODE_DECBKM;
- TRACE(("initialized DECBKM %s\n",
- BtoS(wnew->keyboard.flags & MODE_DECBKM)));
-
- /* look for focus related events on the shell, because we need
- * to care about the shell's border being part of our focus.
- */
- XtAddEventHandler(my_parent, EnterWindowMask, False,
- HandleEnterWindow, (Opaque) NULL);
- XtAddEventHandler(my_parent, LeaveWindowMask, False,
- HandleLeaveWindow, (Opaque) NULL);
- XtAddEventHandler(my_parent, FocusChangeMask, False,
- HandleFocusChange, (Opaque) NULL);
- XtAddEventHandler((Widget) wnew, 0L, True,
- VTNonMaskableEvent, (Opaque) NULL);
- XtAddEventHandler((Widget) wnew, PropertyChangeMask, False,
- HandleBellPropertyChange, (Opaque) NULL);
-
-#if HANDLE_STRUCT_NOTIFY
-#if OPT_TOOLBAR
- wnew->VT100_TB_INFO(menu_bar) = request->VT100_TB_INFO(menu_bar);
- init_Ires(VT100_TB_INFO(menu_height));
-#else
- /* Flag icon name with "***" on window output when iconified.
- * Put in a handler that will tell us when we get Map/Unmap events.
- */
- if (zIconBeep)
-#endif
- XtAddEventHandler(my_parent, StructureNotifyMask, False,
- HandleStructNotify, (Opaque) 0);
-#endif /* HANDLE_STRUCT_NOTIFY */
-
- wnew->screen.bellInProgress = False;
-
- set_character_class(wnew->screen.charClass);
-
- /* create it, but don't realize it */
- ScrollBarOn(wnew, True, False);
-
- /* make sure that the resize gravity acceptable */
- if (wnew->misc.resizeGravity != NorthWestGravity &&
- wnew->misc.resizeGravity != SouthWestGravity) {
- Cardinal nparams = 1;
-
- XtAppWarningMsg(app_con, "rangeError", "resizeGravity", "XTermError",
- "unsupported resizeGravity resource value (%d)",
- (String *) & (wnew->misc.resizeGravity), &nparams);
- wnew->misc.resizeGravity = SouthWestGravity;
- }
-#ifndef NO_ACTIVE_ICON
- wnew->screen.whichVwin = &wnew->screen.fullVwin;
-#if OPT_TEK4014
- wnew->screen.whichTwin = &wnew->screen.fullTwin;
-#endif
-#endif /* NO_ACTIVE_ICON */
-
- if (wnew->screen.savelines < 0)
- wnew->screen.savelines = 0;
-
- init_Bres(screen.awaitInput);
-
- wnew->flags = 0;
- if (!wnew->screen.jumpscroll)
- wnew->flags |= SMOOTHSCROLL;
- if (wnew->misc.reverseWrap)
- wnew->flags |= REVERSEWRAP;
- if (wnew->misc.autoWrap)
- wnew->flags |= WRAPAROUND;
- if (wnew->misc.re_verse != wnew->misc.re_verse0)
- wnew->flags |= REVERSE_VIDEO;
- if (wnew->screen.c132)
- wnew->flags |= IN132COLUMNS;
-
- wnew->initflags = wnew->flags;
-
- init_Ires(keyboard.modify_cursor_keys);
-
- init_Ires(misc.appcursorDefault);
- if (wnew->misc.appcursorDefault)
- wnew->keyboard.flags |= MODE_DECCKM;
-
- init_Ires(misc.appkeypadDefault);
- if (wnew->misc.appkeypadDefault)
- wnew->keyboard.flags |= MODE_DECKPAM;
-
- return;
-}
-
-static void
-VTDestroy(Widget w)
-{
- XtFree((char *) (((XtermWidget) w)->screen.selection_data));
-}
-
-/*ARGSUSED*/
-static void
-VTRealize(Widget w,
- XtValueMask * valuemask,
- XSetWindowAttributes * values)
-{
- XtermWidget xw = (XtermWidget) w;
- TScreen *screen = &xw->screen;
-
- unsigned width, height;
- int xpos, ypos, pr;
- XSizeHints sizehints;
- Atom pid_atom;
-
- TRACE(("VTRealize\n"));
-
- TabReset(xw->tabs);
-
- screen->MenuFontName(fontMenu_fontdefault) = xw->misc.default_font.f_n;
- screen->fnt_norm = NULL;
- screen->fnt_bold = NULL;
-#if OPT_WIDE_CHARS
- screen->fnt_dwd = NULL;
- screen->fnt_dwdb = NULL;
-#endif
- if (!xtermLoadFont(xw,
- &(xw->misc.default_font),
- False, 0)) {
- if (XmuCompareISOLatin1(xw->misc.default_font.f_n, "fixed") != 0) {
- fprintf(stderr,
- "%s: unable to open font \"%s\", trying \"fixed\"....\n",
- xterm_name, xw->misc.default_font.f_n);
- (void) xtermLoadFont(xw,
- xtermFontName("fixed"),
- False, 0);
- screen->MenuFontName(fontMenu_fontdefault) = "fixed";
- }
- }
-
- /* really screwed if we couldn't open default font */
- if (!screen->fnt_norm) {
- fprintf(stderr, "%s: unable to locate a suitable font\n",
- xterm_name);
- Exit(1);
- }
-#if OPT_WIDE_CHARS
- if (xw->screen.utf8_mode) {
- TRACE(("check if this is a wide font, if not try again\n"));
- if (xtermLoadWideFonts(xw, False))
- SetVTFont(xw, screen->menu_font_number, TRUE, NULL);
- }
-#endif
-
- /* making cursor */
- if (!screen->pointer_cursor) {
- screen->pointer_cursor =
- make_colored_cursor(XC_xterm,
- T_COLOR(screen, MOUSE_FG),
- T_COLOR(screen, MOUSE_BG));
- } else {
- recolor_cursor(screen->pointer_cursor,
- T_COLOR(screen, MOUSE_FG),
- T_COLOR(screen, MOUSE_BG));
- }
-
- /* set defaults */
- xpos = 1;
- ypos = 1;
- width = 80;
- height = 24;
-
- TRACE(("parsing geo_metry %s\n", NonNull(xw->misc.geo_metry)));
- pr = XParseGeometry(xw->misc.geo_metry, &xpos, &ypos,
- &width, &height);
- TRACE(("... position %d,%d size %dx%d\n", ypos, xpos, height, width));
-
- set_max_col(screen, (int) (width - 1)); /* units in character cells */
- set_max_row(screen, (int) (height - 1)); /* units in character cells */
- xtermUpdateFontInfo(xw, False);
-
- width = screen->fullVwin.fullwidth;
- height = screen->fullVwin.fullheight;
-
- TRACE(("... border widget %d parent %d shell %d\n",
- BorderWidth(xw),
- BorderWidth(XtParent(xw)),
- BorderWidth(SHELL_OF(xw))));
-
- if ((pr & XValue) && (XNegative & pr)) {
- xpos += DisplayWidth(screen->display, DefaultScreen(screen->display))
- - width - (BorderWidth(XtParent(xw)) * 2);
- }
- if ((pr & YValue) && (YNegative & pr)) {
- ypos += DisplayHeight(screen->display, DefaultScreen(screen->display))
- - height - (BorderWidth(XtParent(xw)) * 2);
- }
-
- /* set up size hints for window manager; min 1 char by 1 char */
- bzero(&sizehints, sizeof(sizehints));
- xtermSizeHints(xw, &sizehints, (xw->misc.scrollbar
- ? (screen->scrollWidget->core.width
- + BorderWidth(screen->scrollWidget))
- : 0));
-
- sizehints.x = xpos;
- sizehints.y = ypos;
- if ((XValue & pr) || (YValue & pr)) {
- sizehints.flags |= USSize | USPosition;
- sizehints.flags |= PWinGravity;
- switch (pr & (XNegative | YNegative)) {
- case 0:
- sizehints.win_gravity = NorthWestGravity;
- break;
- case XNegative:
- sizehints.win_gravity = NorthEastGravity;
- break;
- case YNegative:
- sizehints.win_gravity = SouthWestGravity;
- break;
- default:
- sizehints.win_gravity = SouthEastGravity;
- break;
- }
- } else {
- /* set a default size, but do *not* set position */
- sizehints.flags |= PSize;
- }
- sizehints.height = sizehints.base_height
- + sizehints.height_inc * MaxRows(screen);
- sizehints.width = sizehints.base_width
- + sizehints.width_inc * MaxCols(screen);
-
- if ((WidthValue & pr) || (HeightValue & pr))
- sizehints.flags |= USSize;
- else
- sizehints.flags |= PSize;
-
- /*
- * Note that the size-hints are for the shell, while the resize-request
- * is for the vt100 widget. They are not the same size.
- */
- TRACE(("make resize request %dx%d\n", height, width));
- (void) XtMakeResizeRequest((Widget) xw,
- (Dimension) width, (Dimension) height,
- &xw->core.width, &xw->core.height);
- TRACE(("...made resize request %dx%d\n", xw->core.height, xw->core.width));
-
- /* XXX This is bogus. We are parsing geometries too late. This
- * is information that the shell widget ought to have before we get
- * realized, so that it can do the right thing.
- */
- if (sizehints.flags & USPosition)
- XMoveWindow(XtDisplay(xw), XtWindow(SHELL_OF(xw)),
- sizehints.x, sizehints.y);
-
- TRACE(("%s@%d -- ", __FILE__, __LINE__));
- TRACE_HINTS(&sizehints);
- XSetWMNormalHints(XtDisplay(xw), XtWindow(SHELL_OF(xw)), &sizehints);
- TRACE(("%s@%d -- ", __FILE__, __LINE__));
- TRACE_WM_HINTS(xw);
-
- if ((pid_atom = XInternAtom(XtDisplay(xw), "_NET_WM_PID", False)) != None) {
- /* XChangeProperty format 32 really is "long" */
- unsigned long pid_l = (unsigned long) getpid();
- TRACE(("Setting _NET_WM_PID property to %lu\n", pid_l));
- XChangeProperty(XtDisplay(xw), VShellWindow,
- pid_atom, XA_CARDINAL, 32, PropModeReplace,
- (unsigned char *) &pid_l, 1);
- }
-
- XFlush(XtDisplay(xw)); /* get it out to window manager */
-
- /* use ForgetGravity instead of SouthWestGravity because translating
- the Expose events for ConfigureNotifys is too hard */
- values->bit_gravity = ((xw->misc.resizeGravity == NorthWestGravity)
- ? NorthWestGravity
- : ForgetGravity);
- xw->screen.fullVwin.window = XtWindow(xw) =
- XCreateWindow(XtDisplay(xw), XtWindow(XtParent(xw)),
- xw->core.x, xw->core.y,
- xw->core.width, xw->core.height, BorderWidth(xw),
- (int) xw->core.depth,
- InputOutput, CopyFromParent,
- *valuemask | CWBitGravity, values);
- screen->event_mask = values->event_mask;
-
-#ifndef NO_ACTIVE_ICON
- if (xw->misc.active_icon && screen->fnt_icon) {
- int iconX = 0, iconY = 0;
- Widget shell = SHELL_OF(xw);
- unsigned long mask;
- XGCValues xgcv;
-
- TRACE(("Initializing active-icon\n"));
- XtVaGetValues(shell, XtNiconX, &iconX, XtNiconY, &iconY, (XtPointer) 0);
- xtermComputeFontInfo(xw, &(screen->iconVwin), screen->fnt_icon, 0);
-
- /* since only one client is permitted to select for Button
- * events, we have to let the window manager get 'em...
- */
- values->event_mask &= ~(ButtonPressMask | ButtonReleaseMask);
- values->border_pixel = xw->misc.icon_border_pixel;
-
- screen->iconVwin.window =
- XCreateWindow(XtDisplay(xw),
- RootWindowOfScreen(XtScreen(shell)),
- iconX, iconY,
- screen->iconVwin.fullwidth,
- screen->iconVwin.fullheight,
- xw->misc.icon_border_width,
- (int) xw->core.depth,
- InputOutput, CopyFromParent,
- *valuemask | CWBitGravity | CWBorderPixel,
- values);
- XtVaSetValues(shell,
- XtNiconWindow, screen->iconVwin.window,
- (XtPointer) 0);
- XtRegisterDrawable(XtDisplay(xw), screen->iconVwin.window, w);
-
- mask = (GCFont | GCForeground | GCBackground |
- GCGraphicsExposures | GCFunction);
-
- xgcv.font = screen->fnt_icon->fid;
- xgcv.foreground = T_COLOR(screen, TEXT_FG);
- xgcv.background = T_COLOR(screen, TEXT_BG);
- xgcv.graphics_exposures = True; /* default */
- xgcv.function = GXcopy;
-
- screen->iconVwin.normalGC =
- screen->iconVwin.normalboldGC =
- XtGetGC(shell, mask, &xgcv);
-
- xgcv.foreground = T_COLOR(screen, TEXT_BG);
- xgcv.background = T_COLOR(screen, TEXT_FG);
-
- screen->iconVwin.reverseGC =
- screen->iconVwin.reverseboldGC =
- XtGetGC(shell, mask, &xgcv);
-#if OPT_TOOLBAR
- /*
- * Toolbar is initialized before we get here. Enable the menu item
- * and set it properly.
- */
- set_sensitivity(mw,
- vtMenuEntries[vtMenu_activeicon].widget,
- True);
- update_activeicon();
-#endif
- } else {
- TRACE(("Disabled active-icon\n"));
- xw->misc.active_icon = False;
- }
-#endif /* NO_ACTIVE_ICON */
-
-#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD
- VTInitI18N();
-#else
- xw->screen.xic = NULL;
-#endif
-#if OPT_NUM_LOCK
- VTInitModifiers();
-#endif
-
- set_cursor_gcs(screen);
-
- /* Reset variables used by ANSI emulation. */
-
- resetCharsets(screen);
-
- XDefineCursor(screen->display, VShellWindow, screen->pointer_cursor);
-
- set_cur_col(screen, 0);
- set_cur_row(screen, 0);
- set_max_col(screen, Width(screen) / screen->fullVwin.f_width - 1);
- set_max_row(screen, Height(screen) / screen->fullVwin.f_height - 1);
- set_tb_margins(screen, 0, screen->max_row);
-
- memset(screen->sc, 0, sizeof(screen->sc));
-
- /* Mark screen buffer as unallocated. We wait until the run loop so
- that the child process does not fork and exec with all the dynamic
- memory it will never use. If we were to do it here, the
- swap space for new process would be huge for huge savelines. */
-#if OPT_TEK4014
- if (!tekWidget) /* if not called after fork */
-#endif
- screen->visbuf = screen->allbuf = NULL;
-
- screen->do_wrap = 0;
- screen->scrolls = screen->incopy = 0;
- xtermSetCursorBox(screen);
-
- screen->savedlines = 0;
-
- if (xw->misc.scrollbar) {
- screen->fullVwin.sb_info.width = 0;
- ScrollBarOn(xw, False, True);
- }
- CursorSave(xw);
- return;
-}
-
-#if OPT_I18N_SUPPORT && OPT_INPUT_METHOD
-
-/* limit this feature to recent XFree86 since X11R6.x core dumps */
-#if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && defined(X_HAVE_UTF8_STRING)
-#define USE_XIM_INSTANTIATE_CB
-
-static void
-xim_instantiate_cb(Display * display,
- XPointer client_data GCC_UNUSED,
- XPointer call_data GCC_UNUSED)
-{
- if (display != XtDisplay(term))
- return;
-
- VTInitI18N();
-}
-
-static void
-xim_destroy_cb(XIM im GCC_UNUSED,
- XPointer client_data GCC_UNUSED,
- XPointer call_data GCC_UNUSED)
-{
- term->screen.xic = NULL;
-
- XRegisterIMInstantiateCallback(XtDisplay(term), NULL, NULL, NULL,
- xim_instantiate_cb, NULL);
-}
-#endif /* X11R6+ */
-
-static void
-xim_real_init(void)
-{
- unsigned i, j;
- char *p, *s, *t, *ns, *end, buf[32];
- XIMStyles *xim_styles;
- XIMStyle input_style = 0;
- Bool found;
- static struct {
- char *name;
- unsigned long code;
- } known_style[] = {
- {
- "OverTheSpot", (XIMPreeditPosition | XIMStatusNothing)
- },
- {
- "OffTheSpot", (XIMPreeditArea | XIMStatusArea)
- },
- {
- "Root", (XIMPreeditNothing | XIMStatusNothing)
- },
- };
-
- term->screen.xic = NULL;
-
- if (term->misc.cannot_im) {
- return;
- }
-
- if (!term->misc.input_method || !*term->misc.input_method) {
- if ((p = XSetLocaleModifiers("")) != NULL && *p)
- term->screen.xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL);
- } else {
- s = term->misc.input_method;
- i = 5 + strlen(s);
- t = (char *) MyStackAlloc(i, buf);
- if (t == NULL)
- SysError(ERROR_VINIT);
-
- for (ns = s; ns && *s;) {
- while (*s && isspace(CharOf(*s)))
- s++;
- if (!*s)
- break;
- if ((ns = end = strchr(s, ',')) == 0)
- end = s + strlen(s);
- while ((end != s) && isspace(CharOf(end[-1])))
- end--;
-
- if (end != s) {
- strcpy(t, "@im=");
- strncat(t, s, (unsigned) (end - s));
-
- if ((p = XSetLocaleModifiers(t)) != 0 && *p
- && (term->screen.xim = XOpenIM(XtDisplay(term),
- NULL,
- NULL,
- NULL)) != 0)
- break;
-
- }
- s = ns + 1;
- }
- MyStackFree(t, buf);
- }
-
- if (term->screen.xim == NULL
- && (p = XSetLocaleModifiers("@im=none")) != NULL
- && *p) {
- term->screen.xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL);
- }
-
- if (!term->screen.xim) {
- fprintf(stderr, "Failed to open input method\n");
- return;
- }
- TRACE(("VTInitI18N opened input method\n"));
-
- if (XGetIMValues(term->screen.xim, XNQueryInputStyle, &xim_styles, NULL)
- || !xim_styles
- || !xim_styles->count_styles) {
- fprintf(stderr, "input method doesn't support any style\n");
- XCloseIM(term->screen.xim);
- term->misc.cannot_im = True;
- return;
- }
-
- found = False;
- for (s = term->misc.preedit_type; s && !found;) {
- while (*s && isspace(CharOf(*s)))
- s++;
- if (!*s)
- break;
- if ((ns = end = strchr(s, ',')) != 0)
- ns++;
- else
- end = s + strlen(s);
- while ((end != s) && isspace(CharOf(end[-1])))
- end--;
-
- if (end != s) { /* just in case we have a spurious comma */
- TRACE(("looking for style '%.*s'\n", end - s, s));
- for (i = 0; i < XtNumber(known_style); i++) {
- if ((int) strlen(known_style[i].name) == (end - s)
- && !strncmp(s, known_style[i].name, (unsigned) (end - s))) {
- input_style = known_style[i].code;
- for (j = 0; j < xim_styles->count_styles; j++) {
- if (input_style == xim_styles->supported_styles[j]) {
- found = True;
- break;
- }
- }
- if (found)
- break;
- }
- }
- }
-
- s = ns;
- }
- XFree(xim_styles);
-
- if (!found) {
- fprintf(stderr,
- "input method doesn't support my preedit type (%s)\n",
- term->misc.preedit_type);
- XCloseIM(term->screen.xim);
- term->misc.cannot_im = True;
- return;
- }
-
- /*
- * Check for styles we do not yet support.
- */
- TRACE(("input_style %#lx\n", input_style));
- if (input_style == (XIMPreeditArea | XIMStatusArea)) {
- fprintf(stderr,
- "This program doesn't support the 'OffTheSpot' preedit type\n");
- XCloseIM(term->screen.xim);
- term->misc.cannot_im = True;
- return;
- }
-
- /*
- * For XIMPreeditPosition (or OverTheSpot), XIM client has to
- * prepare a font.
- * The font has to be locale-dependent XFontSet, whereas
- * XTerm use Unicode font. This leads a problem that the
- * same font cannot be used for XIM preedit.
- */
- if (input_style != (XIMPreeditNothing | XIMStatusNothing)) {
- char **missing_charset_list;
- int missing_charset_count;
- char *def_string;
- XVaNestedList p_list;
- XPoint spot =
- {0, 0};
- XFontStruct **fonts;
- char **font_name_list;
-
- term->screen.fs = XCreateFontSet(XtDisplay(term),
- term->misc.f_x,
- &missing_charset_list,
- &missing_charset_count,
- &def_string);
- if (term->screen.fs == NULL) {
- fprintf(stderr, "Preparation of font set "
- "\"%s\" for XIM failed.\n", term->misc.f_x);
- term->screen.fs = XCreateFontSet(XtDisplay(term),
- DEFXIMFONT,
- &missing_charset_list,
- &missing_charset_count,
- &def_string);
- }
- if (term->screen.fs == NULL) {
- fprintf(stderr, "Preparation of default font set "
- "\"%s\" for XIM failed.\n", DEFXIMFONT);
- XCloseIM(term->screen.xim);
- term->misc.cannot_im = True;
- return;
- }
- (void) XExtentsOfFontSet(term->screen.fs);
- j = XFontsOfFontSet(term->screen.fs, &fonts, &font_name_list);
- for (i = 0, term->screen.fs_ascent = 0; i < j; i++) {
- if (term->screen.fs_ascent < (*fonts)->ascent)
- term->screen.fs_ascent = (*fonts)->ascent;
- }
- p_list = XVaCreateNestedList(0,
- XNSpotLocation, &spot,
- XNFontSet, term->screen.fs,
- NULL);
- term->screen.xic = XCreateIC(term->screen.xim,
- XNInputStyle, input_style,
- XNClientWindow, XtWindow(term),
- XNFocusWindow, XtWindow(term),
- XNPreeditAttributes, p_list,
- NULL);
- } else {
- term->screen.xic = XCreateIC(term->screen.xim, XNInputStyle, input_style,
- XNClientWindow, XtWindow(term),
- XNFocusWindow, XtWindow(term),
- NULL);
- }
-
- if (!term->screen.xic) {
- fprintf(stderr, "Failed to create input context\n");
- XCloseIM(term->screen.xim);
- }
-#if defined(USE_XIM_INSTANTIATE_CB)
- else {
- XIMCallback destroy_cb;
-
- destroy_cb.callback = xim_destroy_cb;
- destroy_cb.client_data = NULL;
- if (XSetIMValues(term->screen.xim, XNDestroyCallback, &destroy_cb, NULL))
- fprintf(stderr, "Could not set destroy callback to IM\n");
- }
-#endif
-
- return;
-}
-
-static void
-VTInitI18N(void)
-{
- if (term->misc.open_im) {
- xim_real_init();
-
-#if defined(USE_XIM_INSTANTIATE_CB)
- if (term->screen.xic == NULL && !term->misc.cannot_im) {
- sleep(3);
- XRegisterIMInstantiateCallback(XtDisplay(term), NULL, NULL, NULL,
- xim_instantiate_cb, NULL);
- }
-#endif
- }
-}
-#endif /* OPT_I18N_SUPPORT && OPT_INPUT_METHOD */
-
-static Boolean
-VTSetValues(Widget cur,
- Widget request GCC_UNUSED,
- Widget wnew,
- ArgList args GCC_UNUSED,
- Cardinal *num_args GCC_UNUSED)
-{
- XtermWidget curvt = (XtermWidget) cur;
- XtermWidget newvt = (XtermWidget) wnew;
- Bool refresh_needed = False;
- Bool fonts_redone = False;
-
- if ((T_COLOR(&(curvt->screen), TEXT_BG) !=
- T_COLOR(&(newvt->screen), TEXT_BG)) ||
- (T_COLOR(&(curvt->screen), TEXT_FG) !=
- T_COLOR(&(newvt->screen), TEXT_FG)) ||
- (curvt->screen.MenuFontName(curvt->screen.menu_font_number) !=
- newvt->screen.MenuFontName(newvt->screen.menu_font_number)) ||
- (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n)) {
- if (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n)
- newvt->screen.MenuFontName(fontMenu_fontdefault) = newvt->misc.default_font.f_n;
- if (xtermLoadFont(newvt,
- xtermFontName(newvt->screen.MenuFontName(curvt->screen.menu_font_number)),
- True, newvt->screen.menu_font_number)) {
- /* resizing does the redisplay, so don't ask for it here */
- refresh_needed = True;
- fonts_redone = True;
- } else if (curvt->misc.default_font.f_n != newvt->misc.default_font.f_n)
- newvt->screen.MenuFontName(fontMenu_fontdefault) = curvt->misc.default_font.f_n;
- }
- if (!fonts_redone
- && (T_COLOR(&(curvt->screen), TEXT_CURSOR) !=
- T_COLOR(&(newvt->screen), TEXT_CURSOR))) {
- set_cursor_gcs(&newvt->screen);
- refresh_needed = True;
- }
- if (curvt->misc.re_verse != newvt->misc.re_verse) {
- newvt->flags ^= REVERSE_VIDEO;
- ReverseVideo(newvt);
- newvt->misc.re_verse = !newvt->misc.re_verse; /* ReverseVideo toggles */
- refresh_needed = True;
- }
- if ((T_COLOR(&(curvt->screen), MOUSE_FG) !=
- T_COLOR(&(newvt->screen), MOUSE_FG)) ||
- (T_COLOR(&(curvt->screen), MOUSE_BG) !=
- T_COLOR(&(newvt->screen), MOUSE_BG))) {
- recolor_cursor(newvt->screen.pointer_cursor,
- T_COLOR(&(newvt->screen), MOUSE_FG),
- T_COLOR(&(newvt->screen), MOUSE_BG));
- refresh_needed = True;
- }
- if (curvt->misc.scrollbar != newvt->misc.scrollbar) {
- ToggleScrollBar(newvt);
- }
-
- return refresh_needed;
-}
-
-#define setGC(value) set_at = __LINE__, currentGC = value
-
-#define OutsideSelection(screen,row,col) \
- ((row) > (screen)->endHRow || \
- ((row) == (screen)->endHRow && \
- (col) >= (screen)->endHCol) || \
- (row) < (screen)->startHRow || \
- ((row) == (screen)->startHRow && \
- (col) < (screen)->startHCol))
-
-/*
- * Shows cursor at new cursor position in screen.
- */
-void
-ShowCursor(void)
-{
- TScreen *screen = &term->screen;
- int x, y;
- Char clo;
- unsigned flags;
- unsigned fg_bg = 0;
- GC currentGC;
- int set_at;
- Bool in_selection;
- Bool reversed;
- Pixel fg_pix;
- Pixel bg_pix;
- Pixel tmp;
-#if OPT_HIGHLIGHT_COLOR
- Pixel hi_pix = T_COLOR(screen, HIGHLIGHT_BG);
-#endif
-#if OPT_WIDE_CHARS
- Char chi = 0;
- Char c1h = 0;
- Char c1l = 0;
- Char c2h = 0;
- Char c2l = 0;
- int base;
-#endif
- int cursor_col;
-
- if (screen->cursor_state == BLINKED_OFF)
- return;
-
- if (eventMode != NORMAL)
- return;
-
- if (screen->cur_row - screen->topline > screen->max_row)
- return;
-
- screen->cursor_row = screen->cur_row;
- cursor_col = screen->cursor_col = screen->cur_col;
- screen->cursor_moved = False;
-
-#ifndef NO_ACTIVE_ICON
- if (IsIcon(screen)) {
- screen->cursor_state = ON;
- return;
- }
-#endif /* NO_ACTIVE_ICON */
-
-#if OPT_WIDE_CHARS
- base =
-#endif
- clo = SCRN_BUF_CHARS(screen, screen->cursor_row)[cursor_col];
-
- if_OPT_WIDE_CHARS(screen, {
- int my_col;
- chi = SCRN_BUF_WIDEC(screen, screen->cursor_row)[cursor_col];
- if (clo == HIDDEN_LO && chi == HIDDEN_HI && cursor_col > 0) {
- /* if cursor points to non-initial part of wide character,
- * back it up
- */
- --cursor_col;
- clo = SCRN_BUF_CHARS(screen, screen->cursor_row)[cursor_col];
- chi = SCRN_BUF_WIDEC(screen, screen->cursor_row)[cursor_col];
- }
- my_col = cursor_col;
- base = (chi << 8) | clo;
- if (iswide(base))
- my_col += 1;
- c1l = SCRN_BUF_COM1L(screen, screen->cursor_row)[my_col];
- c1h = SCRN_BUF_COM1H(screen, screen->cursor_row)[my_col];
- c2l = SCRN_BUF_COM2L(screen, screen->cursor_row)[my_col];
- c2h = SCRN_BUF_COM2H(screen, screen->cursor_row)[my_col];
- });
-
- flags = SCRN_BUF_ATTRS(screen, screen->cursor_row)[cursor_col];
-
- if (clo == 0
-#if OPT_WIDE_CHARS
- && chi == 0
-#endif
- ) {
- clo = ' ';
- }
-
- /*
- * If the cursor happens to be on blanks, and the foreground color is set
- * but not the background, do not treat it as a colored cell.
- */
-#if OPT_ISO_COLORS
- if ((flags & TERM_COLOR_FLAGS(term)) == BG_COLOR
-#if OPT_WIDE_CHARS
- && chi == 0
-#endif
- && clo == ' ') {
- flags &= ~TERM_COLOR_FLAGS(term);
- }
-#endif
-
- /*
- * Compare the current cell to the last set of colors used for the
- * cursor and update the GC's if needed.
- */
- if_OPT_EXT_COLORS(screen, {
- fg_bg = (SCRN_BUF_FGRND(screen, screen->cursor_row)[cursor_col] << 8)
- | (SCRN_BUF_BGRND(screen, screen->cursor_row)[cursor_col]);
- });
- if_OPT_ISO_TRADITIONAL_COLORS(screen, {
- fg_bg = SCRN_BUF_COLOR(screen, screen->cursor_row)[cursor_col];
- });
- fg_pix = getXtermForeground(flags, extract_fg(fg_bg, flags));
- bg_pix = getXtermBackground(flags, extract_bg(fg_bg, flags));
-
- if (OutsideSelection(screen, screen->cur_row, screen->cur_col))
- in_selection = False;
- else
- in_selection = True;
-
- reversed = ReverseOrHilite(screen, flags, in_selection);
-
- /* This is like updatedXtermGC(), except that we have to worry about
- * whether the window has focus, since in that case we want just an
- * outline for the cursor.
- */
- if (screen->select || screen->always_highlight) {
- if (reversed) { /* text is reverse video */
- if (screen->cursorGC) {
- setGC(screen->cursorGC);
- } else {
- if (flags & BOLDATTR(screen)) {
- setGC(NormalBoldGC(screen));
- } else {
- setGC(NormalGC(screen));
- }
- }
-#if OPT_HIGHLIGHT_COLOR
- if (hi_pix != T_COLOR(screen, TEXT_FG)
- && hi_pix != fg_pix
- && hi_pix != bg_pix
- && hi_pix != term->dft_foreground) {
- bg_pix = fg_pix;
- fg_pix = hi_pix;
- }
-#endif
- EXCHANGE(fg_pix, bg_pix, tmp);
- } else { /* normal video */
- if (screen->reversecursorGC) {
- setGC(screen->reversecursorGC);
- } else {
- if (flags & BOLDATTR(screen)) {
- setGC(ReverseBoldGC(screen));
- } else {
- setGC(ReverseGC(screen));
- }
- }
- }
- if (T_COLOR(screen, TEXT_CURSOR) == term->dft_foreground) {
- XSetBackground(screen->display, currentGC, fg_pix);
- }
- XSetForeground(screen->display, currentGC, bg_pix);
- } else { /* not selected */
- if (reversed) { /* text is reverse video */
-#if OPT_HIGHLIGHT_COLOR
- if (hi_pix != T_COLOR(screen, TEXT_FG)
- && hi_pix != fg_pix
- && hi_pix != bg_pix
- && hi_pix != term->dft_foreground) {
- bg_pix = fg_pix;
- fg_pix = hi_pix;
- }
-#endif
- setGC(ReverseGC(screen));
- XSetForeground(screen->display, currentGC, bg_pix);
- XSetBackground(screen->display, currentGC, fg_pix);
- } else { /* normal video */
- setGC(NormalGC(screen));
- XSetForeground(screen->display, currentGC, fg_pix);
- XSetBackground(screen->display, currentGC, bg_pix);
- }
- }
-
- if (screen->cursor_busy == 0
- && (screen->cursor_state != ON || screen->cursor_GC != set_at)) {
-
- screen->cursor_GC = set_at;
- TRACE(("ShowCursor calling drawXtermText cur(%d,%d)\n",
- screen->cur_row, screen->cur_col));
-
- drawXtermText(screen, flags & DRAWX_MASK, currentGC,
- x = CurCursorX(screen, screen->cur_row, cursor_col),
- y = CursorY(screen, screen->cur_row),
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(&clo, &chi), 1, 0);
-
-#if OPT_WIDE_CHARS
- if (c1l || c1h) {
- drawXtermText(screen, (flags & DRAWX_MASK) | NOBACKGROUND,
- currentGC, x, y,
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(&c1l, &c1h), 1, iswide(base));
-
- if (c2l || c2h)
- drawXtermText(screen, (flags & DRAWX_MASK) | NOBACKGROUND,
- currentGC, x, y,
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(&c2l, &c2h), 1, iswide(base));
- }
-#endif
-
- if (!screen->select && !screen->always_highlight) {
- screen->box->x = x;
- screen->box->y = y;
- XDrawLines(screen->display, VWindow(screen),
- screen->cursoroutlineGC ? screen->cursoroutlineGC
- : currentGC,
- screen->box, NBOX, CoordModePrevious);
- }
- }
- screen->cursor_state = ON;
-}
-
-/*
- * hide cursor at previous cursor position in screen.
- */
-void
-HideCursor(void)
-{
- TScreen *screen = &term->screen;
- GC currentGC;
- unsigned flags;
- unsigned fg_bg = 0;
- int x, y;
- Char clo;
- Bool in_selection;
-#if OPT_WIDE_CHARS
- Char chi = 0;
- Char c1h = 0;
- Char c1l = 0;
- Char c2h = 0;
- Char c2l = 0;
- int base;
-#endif
- int cursor_col;
-
- if (screen->cursor_state == OFF) /* FIXME */
- return;
- if (screen->cursor_row - screen->topline > screen->max_row)
- return;
-
- cursor_col = screen->cursor_col;
-
-#ifndef NO_ACTIVE_ICON
- if (IsIcon(screen)) {
- screen->cursor_state = OFF;
- return;
- }
-#endif /* NO_ACTIVE_ICON */
-
-#if OPT_WIDE_CHARS
- base =
-#endif
- clo = SCRN_BUF_CHARS(screen, screen->cursor_row)[cursor_col];
- flags = SCRN_BUF_ATTRS(screen, screen->cursor_row)[cursor_col];
-
- if_OPT_WIDE_CHARS(screen, {
- int my_col;
- chi = SCRN_BUF_WIDEC(screen, screen->cursor_row)[cursor_col];
- if (clo == HIDDEN_LO && chi == HIDDEN_HI) {
- /* if cursor points to non-initial part of wide character,
- * back it up
- */
- --cursor_col;
- clo = SCRN_BUF_CHARS(screen, screen->cursor_row)[cursor_col];
- chi = SCRN_BUF_WIDEC(screen, screen->cursor_row)[cursor_col];
- }
- my_col = cursor_col;
- base = (chi << 8) | clo;
- if (iswide(base))
- my_col += 1;
- c1l = SCRN_BUF_COM1L(screen, screen->cursor_row)[my_col];
- c1h = SCRN_BUF_COM1H(screen, screen->cursor_row)[my_col];
- c2l = SCRN_BUF_COM2L(screen, screen->cursor_row)[my_col];
- c2h = SCRN_BUF_COM2H(screen, screen->cursor_row)[my_col];
- });
-
- if_OPT_EXT_COLORS(screen, {
- fg_bg = (SCRN_BUF_FGRND(screen, screen->cursor_row)[cursor_col] << 8)
- | (SCRN_BUF_BGRND(screen, screen->cursor_row)[cursor_col]);
- });
- if_OPT_ISO_TRADITIONAL_COLORS(screen, {
- fg_bg = SCRN_BUF_COLOR(screen, screen->cursor_row)[cursor_col];
- });
-
- if (OutsideSelection(screen, screen->cursor_row, screen->cursor_col))
- in_selection = False;
- else
- in_selection = True;
-
- currentGC = updatedXtermGC(screen, flags, fg_bg, in_selection);
-
- if (clo == 0
-#if OPT_WIDE_CHARS
- && chi == 0
-#endif
- ) {
- clo = ' ';
- }
-
- TRACE(("HideCursor calling drawXtermText cur(%d,%d)\n",
- screen->cursor_row, screen->cursor_col));
- drawXtermText(screen, flags & DRAWX_MASK, currentGC,
- x = CurCursorX(screen, screen->cursor_row, cursor_col),
- y = CursorY(screen, screen->cursor_row),
- curXtermChrSet(screen->cursor_row),
- PAIRED_CHARS(&clo, &chi), 1, 0);
-
-#if OPT_WIDE_CHARS
- if (c1l || c1h) {
- drawXtermText(screen, (flags & DRAWX_MASK) | NOBACKGROUND,
- currentGC, x, y,
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(&c1l, &c1h), 1, iswide(base));
-
- if (c2l || c2h)
- drawXtermText(screen, (flags & DRAWX_MASK) | NOBACKGROUND,
- currentGC, x, y,
- curXtermChrSet(screen->cur_row),
- PAIRED_CHARS(&c2l, &c2h), 1, iswide(base));
- }
-#endif
- screen->cursor_state = OFF;
- resetXtermGC(screen, flags, in_selection);
-}
-
-#if OPT_BLINK_CURS || OPT_BLINK_TEXT
-static void
-StartBlinking(TScreen * screen)
-{
- if (screen->blink_timer == 0) {
- unsigned long interval = (screen->cursor_state == ON ?
- screen->blink_on : screen->blink_off);
- if (interval == 0) /* wow! */
- interval = 1; /* let's humor him anyway */
- screen->blink_timer = XtAppAddTimeOut(app_con,
- interval,
- HandleBlinking,
- screen);
- }
-}
-
-static void
-StopBlinking(TScreen * screen)
-{
- if (screen->blink_timer)
- XtRemoveTimeOut(screen->blink_timer);
- screen->blink_timer = 0;
-}
-
-#if OPT_BLINK_TEXT
-static Bool
-ScrnHasBlinking(TScreen * screen, int row)
-{
- Char *attrs = SCRN_BUF_ATTRS(screen, row);
- int col;
- Bool result = False;
-
- for (col = 0; col < MaxCols(screen); ++col) {
- if (attrs[col] & BLINK) {
- result = True;
- break;
- }
- }
- return result;
-}
-#endif
-
-/*
- * Blink the cursor by alternately showing/hiding cursor. We leave the timer
- * running all the time (even though that's a little inefficient) to make the
- * logic simple.
- */
-static void
-HandleBlinking(XtPointer closure, XtIntervalId * id GCC_UNUSED)
-{
- TScreen *screen = (TScreen *) closure;
- Bool resume = False;
-
- screen->blink_timer = 0;
- screen->blink_state = !screen->blink_state;
-
-#if OPT_BLINK_CURS
- if (DoStartBlinking(screen)) {
- if (screen->cursor_state == ON) {
- if (screen->select || screen->always_highlight) {
- HideCursor();
- if (screen->cursor_state == OFF)
- screen->cursor_state = BLINKED_OFF;
- }
- } else if (screen->cursor_state == BLINKED_OFF) {
- screen->cursor_state = OFF;
- ShowCursor();
- if (screen->cursor_state == OFF)
- screen->cursor_state = BLINKED_OFF;
- }
- resume = True;
- }
-#endif
-
-#if OPT_BLINK_TEXT
- /*
- * Inspect the line on the current screen to see if any have the BLINK flag
- * associated with them. Prune off any that have had the corresponding
- * cells reset. If any are left, repaint those lines with ScrnRefresh().
- */
- if (!(screen->blink_as_bold)) {
- int row;
- int first_row = screen->max_row;
- int last_row = -1;
-
- for (row = screen->max_row; row >= 0; row--) {
- if (ScrnTstBlinked(screen, row)) {
- if (ScrnHasBlinking(screen, row)) {
- resume = True;
- if (row > last_row)
- last_row = row;
- if (row < first_row)
- first_row = row;
- } else {
- ScrnClrBlinked(screen, row);
- }
- }
- }
- /*
- * FIXME: this could be a little more efficient, e.g,. by limiting the
- * columns which are updated.
- */
- if (first_row <= last_row) {
- ScrnRefresh(screen,
- first_row,
- 0,
- last_row + 1 - first_row,
- MaxCols(screen),
- True);
- }
- }
-#endif
-
- /*
- * If either the cursor or text is blinking, restart the timer.
- */
- if (resume)
- StartBlinking(screen);
-}
-#endif /* OPT_BLINK_CURS || OPT_BLINK_TEXT */
-
-/*
- * Implement soft or hard (full) reset of the VTxxx emulation. There are a
- * couple of differences from real DEC VTxxx terminals (to avoid breaking
- * applications which have come to rely on xterm doing this):
- *
- * + autowrap mode should be reset (instead it's reset to the resource
- * default).
- * + the popup menu offers a choice of resetting the savedLines, or not.
- * (but the control sequence does this anyway).
- */
-void
-VTReset(Bool full, Bool saved)
-{
- TScreen *screen = &term->screen;
-
- if (!XtIsRealized((Widget) term)) {
- Bell(XkbBI_MinorError, 0);
- return;
- }
-
- if (saved) {
- screen->savedlines = 0;
- ScrollBarDrawThumb(screen->scrollWidget);
- }
-
- /* make cursor visible */
- screen->cursor_set = ON;
-
- /* reset scrolling region */
- set_tb_margins(screen, 0, screen->max_row);
-
- bitclr(&term->flags, ORIGIN);
-
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Colors();
- });
-
- /* Reset character-sets to initial state */
- resetCharsets(screen);
-
- /* Reset DECSCA */
- bitclr(&term->flags, PROTECTED);
- screen->protected_mode = OFF_PROTECT;
-
- if (full) { /* RIS */
- if (screen->bellOnReset)
- Bell(XkbBI_TerminalBell, 0);
-
- /* reset the mouse mode */
- screen->send_mouse_pos = MOUSE_OFF;
- waitingForTrackInfo = False;
- eventMode = NORMAL;
-
- TabReset(term->tabs);
- term->keyboard.flags = MODE_SRM;
-#if OPT_INITIAL_ERASE
- if (term->keyboard.reset_DECBKM == 1)
- term->keyboard.flags |= MODE_DECBKM;
- else if (term->keyboard.reset_DECBKM == 2)
-#endif
- if (term->screen.backarrow_key)
- term->keyboard.flags |= MODE_DECBKM;
- TRACE(("full reset DECBKM %s\n",
- BtoS(term->keyboard.flags & MODE_DECBKM)));
- update_appcursor();
- update_appkeypad();
- update_decbkm();
- show_8bit_control(False);
- reset_decudk();
-
- FromAlternate(screen);
- ClearScreen(screen);
- screen->cursor_state = OFF;
- if (term->flags & REVERSE_VIDEO)
- ReverseVideo(term);
-
- term->flags = term->initflags;
- update_reversevideo();
- update_autowrap();
- update_reversewrap();
- update_autolinefeed();
-
- screen->jumpscroll = !(term->flags & SMOOTHSCROLL);
- update_jumpscroll();
-
- if (screen->c132 && (term->flags & IN132COLUMNS)) {
- Dimension reqWidth = (80 * FontWidth(screen)
- + 2 * screen->border + ScrollbarWidth(screen));
- Dimension reqHeight = (FontHeight(screen)
- * MaxRows(screen) + 2 * screen->border);
- Dimension replyWidth;
- Dimension replyHeight;
-
- TRACE(("Making resize-request to restore 80-columns %dx%d\n",
- reqHeight, reqWidth));
- XtMakeResizeRequest((Widget) term,
- reqWidth,
- reqHeight,
- &replyWidth, &replyHeight);
- TRACE(("...result %dx%d\n", replyHeight, replyWidth));
- repairSizeHints();
- XSync(screen->display, False); /* synchronize */
- if (XtAppPending(app_con))
- xevents();
- }
-
- CursorSet(screen, 0, 0, term->flags);
- CursorSave(term);
- } else { /* DECSTR */
- /*
- * There's a tiny difference, to accommodate usage of xterm.
- * We reset autowrap to the resource values rather than turning
- * it off.
- */
- term->keyboard.flags &= ~(MODE_DECCKM | MODE_KAM | MODE_DECKPAM);
- bitcpy(&term->flags, term->initflags, WRAPAROUND | REVERSEWRAP);
- bitclr(&term->flags, INSERT | INVERSE | BOLD | BLINK | UNDERLINE | INVISIBLE);
- if_OPT_ISO_COLORS(screen, {
- reset_SGR_Colors();
- });
- update_appcursor();
- update_autowrap();
- update_reversewrap();
-
- CursorSave(term);
- screen->sc[screen->alternate != False].row =
- screen->sc[screen->alternate != False].col = 0;
- }
- longjmp(vtjmpbuf, 1); /* force ground state in parser */
-}
-
-/*
- * set_character_class - takes a string of the form
- *
- * low[-high]:val[,low[-high]:val[...]]
- *
- * and sets the indicated ranges to the indicated values.
- */
-static int
-set_character_class(char *s)
-{
- int i; /* iterator, index into s */
- int len; /* length of s */
- int acc; /* accumulator */
- int low, high; /* bounds of range [0..127] */
- int base; /* 8, 10, 16 (octal, decimal, hex) */
- int numbers; /* count of numbers per range */
- int digits; /* count of digits in a number */
- static char *errfmt = "%s: %s in range string \"%s\" (position %d)\n";
-
- if (!s || !s[0])
- return -1;
-
- base = 10; /* in case we ever add octal, hex */
- low = high = -1; /* out of range */
-
- for (i = 0, len = strlen(s), acc = 0, numbers = digits = 0;
- i < len; i++) {
- Char c = s[i];
-
- if (isspace(c)) {
- continue;
- } else if (isdigit(c)) {
- acc = acc * base + (c - '0');
- digits++;
- continue;
- } else if (c == '-') {
- low = acc;
- acc = 0;
- if (digits == 0) {
- fprintf(stderr, errfmt, ProgramName, "missing number", s, i);
- return (-1);
- }
- digits = 0;
- numbers++;
- continue;
- } else if (c == ':') {
- if (numbers == 0)
- low = acc;
- else if (numbers == 1)
- high = acc;
- else {
- fprintf(stderr, errfmt, ProgramName, "too many numbers",
- s, i);
- return (-1);
- }
- digits = 0;
- numbers++;
- acc = 0;
- continue;
- } else if (c == ',') {
- /*
- * now, process it
- */
-
- if (high < 0) {
- high = low;
- numbers++;
- }
- if (numbers != 2) {
- fprintf(stderr, errfmt, ProgramName, "bad value number",
- s, i);
- } else if (SetCharacterClassRange(low, high, acc) != 0) {
- fprintf(stderr, errfmt, ProgramName, "bad range", s, i);
- }
-
- low = high = -1;
- acc = 0;
- digits = 0;
- numbers = 0;
- continue;
- } else {
- fprintf(stderr, errfmt, ProgramName, "bad character", s, i);
- return (-1);
- } /* end if else if ... else */
-
- }
-
- if (low < 0 && high < 0)
- return (0);
-
- /*
- * now, process it
- */
-
- if (high < 0)
- high = low;
- if (numbers < 1 || numbers > 2) {
- fprintf(stderr, errfmt, ProgramName, "bad value number", s, i);
- } else if (SetCharacterClassRange(low, high, acc) != 0) {
- fprintf(stderr, errfmt, ProgramName, "bad range", s, i);
- }
-
- return (0);
-}
-
-/* ARGSUSED */
-static void
-HandleKeymapChange(Widget w,
- XEvent * event GCC_UNUSED,
- String * params,
- Cardinal *param_count)
-{
- static XtTranslations keymap, original;
- static XtResource key_resources[] =
- {
- {XtNtranslations, XtCTranslations, XtRTranslationTable,
- sizeof(XtTranslations), 0, XtRTranslationTable, (XtPointer) NULL}
- };
- char mapName[1000];
- char mapClass[1000];
- char *pmapName;
- char *pmapClass;
- size_t len;
-
- if (*param_count != 1)
- return;
-
- if (original == NULL)
- original = w->core.tm.translations;
-
- if (strcmp(params[0], "None") == 0) {
- XtOverrideTranslations(w, original);
- return;
- }
-
- len = strlen(params[0]) + 7;
-
- pmapName = (char *) MyStackAlloc(len, mapName);
- pmapClass = (char *) MyStackAlloc(len, mapClass);
- if (pmapName == NULL
- || pmapClass == NULL)
- SysError(ERROR_KMMALLOC1);
-
- (void) sprintf(pmapName, "%sKeymap", params[0]);
- (void) strcpy(pmapClass, pmapName);
- if (islower(CharOf(pmapClass[0])))
- pmapClass[0] = toupper(CharOf(pmapClass[0]));
- XtGetSubresources(w, (XtPointer) &keymap, pmapName, pmapClass,
- key_resources, (Cardinal) 1, NULL, (Cardinal) 0);
- if (keymap != NULL)
- XtOverrideTranslations(w, keymap);
-
- MyStackFree(pmapName, mapName);
- MyStackFree(pmapClass, mapClass);
-}
-
-/* ARGSUSED */
-static void
-HandleBell(Widget w GCC_UNUSED,
- XEvent * event GCC_UNUSED,
- String * params, /* [0] = volume */
- Cardinal *param_count) /* 0 or 1 */
-{
- int percent = (*param_count) ? atoi(params[0]) : 0;
-
- Bell(XkbBI_TerminalBell, percent);
-}
-
-/* ARGSUSED */
-static void
-HandleVisualBell(Widget w GCC_UNUSED,
- XEvent * event GCC_UNUSED,
- String * params GCC_UNUSED,
- Cardinal *param_count GCC_UNUSED)
-{
- VisualBell();
-}
-
-/* ARGSUSED */
-static void
-HandleIgnore(Widget w,
- XEvent * event,
- String * params GCC_UNUSED,
- Cardinal *param_count GCC_UNUSED)
-{
- /* do nothing, but check for funny escape sequences */
- (void) SendMousePosition(w, event);
-}
-
-/* ARGSUSED */
-static void
-DoSetSelectedFont(Widget w GCC_UNUSED,
- XtPointer client_data GCC_UNUSED,
- Atom * selection GCC_UNUSED,
- Atom * type,
- XtPointer value,
- unsigned long *length GCC_UNUSED,
- int *format)
-{
- char *val = (char *) value;
- int len;
- if (*type != XA_STRING || *format != 8) {
- Bell(XkbBI_MinorError, 0);
- return;
- }
- len = strlen(val);
- if (len > 0) {
- if (val[len - 1] == '\n')
- val[len - 1] = '\0';
- /* Do some sanity checking to avoid sending a long selection
- back to the server in an OpenFont that is unlikely to succeed.
- XLFD allows up to 255 characters and no control characters;
- we are a little more liberal here. */
- if (len > 1000 || strchr(val, '\n'))
- return;
- if (!xtermLoadFont(term,
- xtermFontName(val),
- True,
- fontMenu_fontsel))
- Bell(XkbBI_MinorError, 0);
- }
-}
-
-void
-FindFontSelection(char *atom_name, Bool justprobe)
-{
- static AtomPtr *atoms;
- static int atomCount = 0;
- AtomPtr *pAtom;
- int a;
- Atom target;
-
- if (!atom_name)
- atom_name = "PRIMARY";
-
- for (pAtom = atoms, a = atomCount; a; a--, pAtom++) {
- if (strcmp(atom_name, XmuNameOfAtom(*pAtom)) == 0)
- break;
- }
- if (!a) {
- atoms = (AtomPtr *) XtRealloc((char *) atoms,
- sizeof(AtomPtr) * (atomCount + 1));
- *(pAtom = &atoms[atomCount++]) = XmuMakeAtom(atom_name);
- }
-
- target = XmuInternAtom(XtDisplay(term), *pAtom);
- if (justprobe) {
- term->screen.MenuFontName(fontMenu_fontsel) =
- XGetSelectionOwner(XtDisplay(term), target) ? _Font_Selected_ : 0;
- } else {
- XtGetSelectionValue((Widget) term, target, XA_STRING,
- DoSetSelectedFont, NULL,
- XtLastTimestampProcessed(XtDisplay(term)));
- }
- return;
-}
-
-void
-set_cursor_gcs(TScreen * screen)
-{
- XGCValues xgcv;
- XtGCMask mask;
- Pixel cc = T_COLOR(screen, TEXT_CURSOR);
- Pixel fg = T_COLOR(screen, TEXT_FG);
- Pixel bg = T_COLOR(screen, TEXT_BG);
- GC new_cursorGC = NULL;
- GC new_cursorFillGC = NULL;
- GC new_reversecursorGC = NULL;
- GC new_cursoroutlineGC = NULL;
-
- /*
- * Let's see, there are three things that have "color":
- *
- * background
- * text
- * cursorblock
- *
- * And, there are four situation when drawing a cursor, if we decide
- * that we like have a solid block of cursor color with the letter
- * that it is highlighting shown in the background color to make it
- * stand out:
- *
- * selected window, normal video - background on cursor
- * selected window, reverse video - foreground on cursor
- * unselected window, normal video - foreground on background
- * unselected window, reverse video - background on foreground
- *
- * Since the last two are really just normalGC and reverseGC, we only
- * need two new GC's. Under monochrome, we get the same effect as
- * above by setting cursor color to foreground.
- */
-
-#if OPT_ISO_COLORS
- /*
- * If we're using ANSI colors, the functions manipulating the SGR code will
- * use the same GC's. To avoid having the cursor change color, we use the
- * Xlib calls rather than the Xt calls.
- *
- * Use the colorMode value to determine which we'll do (the VWindow may
- * not be set before the widget's realized, so it's tested separately).
- */
- if (screen->colorMode) {
- if (VWindow(screen) != 0 && (cc != bg) && (cc != fg)) {
- /* we might have a colored foreground/background later */
- xgcv.font = screen->fnt_norm->fid;
- mask = (GCForeground | GCBackground | GCFont);
- xgcv.foreground = fg;
- xgcv.background = cc;
- new_cursorGC = XCreateGC(screen->display, VWindow(screen), mask, &xgcv);
-
- xgcv.foreground = cc;
- xgcv.background = fg;
- new_cursorFillGC =
- XCreateGC(screen->display, VWindow(screen), mask, &xgcv);
-
- if (screen->always_highlight) {
- new_reversecursorGC = (GC) 0;
- new_cursoroutlineGC = (GC) 0;
- } else {
- xgcv.foreground = bg;
- xgcv.background = cc;
- new_reversecursorGC =
- XCreateGC(screen->display, VWindow(screen), mask, &xgcv);
- xgcv.foreground = cc;
- xgcv.background = bg;
- new_cursoroutlineGC =
- XCreateGC(screen->display, VWindow(screen), mask, &xgcv);
- }
- }
- } else
-#endif
- if (cc != fg && cc != bg) {
- /* we have a colored cursor */
- xgcv.font = screen->fnt_norm->fid;
- mask = (GCForeground | GCBackground | GCFont);
-
- xgcv.foreground = fg;
- xgcv.background = cc;
- new_cursorGC = XtGetGC((Widget) term, mask, &xgcv);
-
- xgcv.foreground = cc;
- xgcv.background = fg;
- new_cursorFillGC = XtGetGC((Widget) term, mask, &xgcv);
-
- if (screen->always_highlight) {
- new_reversecursorGC = (GC) 0;
- new_cursoroutlineGC = (GC) 0;
- } else {
- xgcv.foreground = bg;
- xgcv.background = cc;
- new_reversecursorGC = XtGetGC((Widget) term, mask, &xgcv);
- xgcv.foreground = cc;
- xgcv.background = bg;
- new_cursoroutlineGC = XtGetGC((Widget) term, mask, &xgcv);
- }
- }
-#if OPT_ISO_COLORS
- if (screen->colorMode) {
- if (screen->cursorGC)
- XFreeGC(screen->display, screen->cursorGC);
- if (screen->fillCursorGC)
- XFreeGC(screen->display, screen->fillCursorGC);
- if (screen->reversecursorGC)
- XFreeGC(screen->display, screen->reversecursorGC);
- if (screen->cursoroutlineGC)
- XFreeGC(screen->display, screen->cursoroutlineGC);
- } else
-#endif
- {
- if (screen->cursorGC)
- XtReleaseGC((Widget) term, screen->cursorGC);
- if (screen->fillCursorGC)
- XtReleaseGC((Widget) term, screen->fillCursorGC);
- if (screen->reversecursorGC)
- XtReleaseGC((Widget) term, screen->reversecursorGC);
- if (screen->cursoroutlineGC)
- XtReleaseGC((Widget) term, screen->cursoroutlineGC);
- }
-
- screen->cursorGC = new_cursorGC;
- screen->fillCursorGC = new_cursorFillGC;
- screen->reversecursorGC = new_reversecursorGC;
- screen->cursoroutlineGC = new_cursoroutlineGC;
-}