2252 lines
68 KiB
C
2252 lines
68 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* *
|
|
* (c) Copyright 1993, 1994, 1996 Hewlett-Packard Company *
|
|
* (c) Copyright 1993, 1994, 1996 International Business Machines Corp. *
|
|
* (c) Copyright 1993, 1994, 1996 Sun Microsystems, Inc. *
|
|
* (c) Copyright 1993, 1994, 1996 Novell, Inc. *
|
|
* (c) Copyright 1996 Digital Equipment Corporation. *
|
|
* (c) Copyright 1996 FUJITSU LIMITED. *
|
|
* (c) Copyright 1996 Hitachi. *
|
|
*/
|
|
|
|
#include <wctype.h>
|
|
|
|
#include "TermHeader.h"
|
|
#include "TermPrimDebug.h"
|
|
#include "TermPrimP.h"
|
|
#include "TermPrimI.h"
|
|
#include "TermP.h"
|
|
#include "TermPrimData.h"
|
|
#include "TermData.h"
|
|
#include "TermPrimBuffer.h"
|
|
#include "TermPrimParserP.h"
|
|
#include "TermFunction.h"
|
|
#include "TermBuffer.h"
|
|
#include "TermFunctionKey.h"
|
|
#include "TermParseTableP.h"
|
|
#include "TermBufferP.h"
|
|
#include "TermPrimUtil.h"
|
|
#include "TermPrimParseTable.h"
|
|
|
|
#if defined (__hpux)
|
|
/*
|
|
* On HP MAXINT is defined in both <values.h> and <sys/param.h>
|
|
*/
|
|
#undef MAXINT
|
|
#endif
|
|
#if defined(CSRG_BASED)
|
|
#define MAXSHORT SHRT_MAX
|
|
#else
|
|
#include <values.h>
|
|
#endif
|
|
|
|
/*****************************************************************************/
|
|
|
|
#define NPARAM 16
|
|
#define PCOUNT(c) ((c)->parms[0])
|
|
#define BASE 1 /* row and column count base 0 or 1 */
|
|
|
|
/*********************************************************************
|
|
* Macros for handling cursor constraints - return values in coordinate
|
|
* system for Term widget (base 0) BASE which is 1 reflects the Vt base
|
|
*
|
|
* These defines need to account of for Origin mode eventually TMH */
|
|
|
|
#define TOPROW(w) (1-BASE)
|
|
#define TOPMARGIN(w) ((w)->term.tpd->scrollLockTopRow-(1-BASE))
|
|
#define BOTTOMMARGIN(w) ((w)->term.tpd->scrollLockBottomRow-(1-BASE))
|
|
#define BOTTOMROW(w) ((w)->term.rows-BASE)
|
|
/* FIRSTCOLUMN(w) ABS(BASE-1) */
|
|
#define FIRSTCOLUMN(w) 0
|
|
#define LASTCOLUMN(w) ((w)->term.columns-BASE)
|
|
#define FLOOR(w) ((w)->vt.td->originMode?(w)->term.tpd->scrollLockBottomRow:\
|
|
BOTTOMROW(w))
|
|
#define CEILING(w) ((w)->vt.td->originMode?(w)->term.tpd->scrollLockTopRow:\
|
|
TOPROW(w))
|
|
#define KILLWRAP(w) if((w)->term.tpd->cursorColumn>LASTCOLUMN(w)) \
|
|
(w)->term.tpd->cursorColumn=LASTCOLUMN(w)
|
|
#define STORELASTARG(c) (c)->parms[PCOUNT(c)]=(c)->workingNum
|
|
|
|
/******************************************************************
|
|
* Upon entering a parse routine the parameter count is contained
|
|
* in context->parms[0].
|
|
*
|
|
* The last parmameter parsed is in context->workingNum
|
|
* Next to last parmameter is in {context->parms[0]==1?context->workingNum:
|
|
* context->parms[context->param[0]-1]}
|
|
* .
|
|
* .
|
|
*
|
|
* First parameter is in context->parms[1]
|
|
*
|
|
* In some of the parse routines, the default case of too many parameters
|
|
* needs to be handled like Vt (silently use the first n parameters)
|
|
* Vt has a max of 16 numeric parameters; The rest fall off the end
|
|
* silently.
|
|
*******************************************************************/
|
|
|
|
void
|
|
_DtTermClearParam(Widget w)
|
|
{
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
PCOUNT(context)=0 ;
|
|
_DtTermPrimParserClearParm(w) ;
|
|
_DtTermPrimParserClrStrParm(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermEnterNum(Widget w)
|
|
{
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
_DtTermPrimParserEnterNum(w) ;
|
|
if (!PCOUNT(context)) PCOUNT(context)++ ; /* increment for first number ONLY*/
|
|
}
|
|
|
|
void
|
|
_DtTermParsePushNum(Widget w)
|
|
{
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
/* parmN(w,PCOUNT(c)) ; Should use this but not global */
|
|
if ( context->workingNumIsDefault != True) { /* did we actually parse a num*/
|
|
_DtTermPrimParserNumParmPush(w,PCOUNT(context)) ;
|
|
}
|
|
else {
|
|
if (!PCOUNT(context)) PCOUNT(context)++ ;/* increment for first number ONLY*/
|
|
}
|
|
|
|
if ( ++PCOUNT(context)>NPARAM ) {
|
|
Debug('P',fprintf(stderr,">>Too many parameters\n")) ;
|
|
return ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermSaveChar(Widget w)
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
ParserContext context ;
|
|
wchar_t c;
|
|
context = GetParserContext(w) ;
|
|
|
|
mbtowc(&c,(char *)context->inputChar,MB_CUR_MAX);
|
|
if ( context->stringParms[0].length < STR_SIZE && iswprint(c) ) {
|
|
strncpy( (
|
|
(char *)&context->stringParms[0].str[context->stringParms[0].length]),
|
|
(char *)context->inputChar, context->inputCharLen) ;
|
|
context->stringParms[0].length += context->inputCharLen ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermPrintState(Widget w)
|
|
{
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
/* fprintf(stderr,"Warning: Not a valid escape sequence\n") ;*/
|
|
context->stateTable = _DtTermStateStart ;
|
|
_DtTermClearParam(w) ;
|
|
}
|
|
|
|
/* a utility for checking for S8C1TMode */
|
|
static void
|
|
sendEscSequence(Widget w, char *transmitString)
|
|
{
|
|
DtTermWidget tw = (DtTermWidget)w;
|
|
DtTermData td = tw->vt.td;
|
|
|
|
if ( td->S8C1TMode ) {
|
|
char *cbuf =malloc(strlen(transmitString)+1);
|
|
strcpy(cbuf,transmitString) ;
|
|
cbuf[1] = 0x9B ;
|
|
(void) _DtTermPrimSendInput(w, (unsigned char *) (cbuf+1),
|
|
strlen(cbuf+1));
|
|
free(cbuf) ;
|
|
}
|
|
else {
|
|
(void) _DtTermPrimSendInput(w, (unsigned char *) transmitString,
|
|
strlen(transmitString));
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermDeviceStatus(Widget w) /* DSR CSI?pn */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermData vtd = ((DtTermWidget)w)->vt.td;
|
|
ParserContext context ;
|
|
char buf[100] ;
|
|
int col,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDeviceStatus\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
switch ( context->parms[1] ) {
|
|
case 15: /* printer status - we don't have one */
|
|
sendEscSequence(w,"\033[?13n") ;
|
|
break;
|
|
case 25: /* User defined keys locked? */
|
|
if ( vtd->userKeysLocked )
|
|
sendEscSequence(w,"\033[?21n") ;
|
|
else
|
|
sendEscSequence(w,"\033[?20n") ;
|
|
break;
|
|
case 26: /* keyboard status - always send North American */
|
|
sendEscSequence(w,"\033[?27;1n") ;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermDeviceStatusAnsi(Widget w) /* DSR CSIpn */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermData vtd = ((DtTermWidget)w)->vt.td;
|
|
ParserContext context ;
|
|
char buf[100] ;
|
|
int row,col,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDeviceStatus\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
switch ( context->parms[1] ) {
|
|
case 5: /* as far as I know, all's well... So send OK */
|
|
sendEscSequence(w,"\033[0n") ;
|
|
break;
|
|
case 6:
|
|
/* cursor could be past last row (for autowrap) */
|
|
if ((col=tw->term.tpd->cursorColumn)>LASTCOLUMN(tw))
|
|
col=LASTCOLUMN(tw) ;
|
|
row = tw->term.tpd->cursorRow+BASE ;
|
|
if (vtd->originMode==True) row -= TOPMARGIN(tw) ;
|
|
sprintf(buf,"\033[%d;%dR",row , col+BASE) ;
|
|
sendEscSequence(w,buf) ;
|
|
break ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermPModeSet(Widget w) /* DECSET CSI?ph */
|
|
{
|
|
ParserContext context ;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermWidget vtw = (DtTermWidget)w;
|
|
int i,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermPModeSet\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
/* from vt220 */
|
|
case 1: /* Cursor key (Application) */
|
|
vtw->vt.td->applicationMode=True;
|
|
break;
|
|
/* case 2: can't return from vt52 mode */
|
|
case 3: /* Column (132) */
|
|
if ( vtw->vt.c132 ) { /* xterm allow 132 mode */
|
|
(void) _DtTermFuncClearBuffer(w, 0, fromParser);
|
|
vtw->term.tpd->cursorRow = TOPROW(vtw) ;
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(vtw) ;
|
|
vtw->term.tpd->scrollLockTopRow = TOPROW(vtw);
|
|
vtw->term.tpd->scrollLockBottomRow = BOTTOMROW(vtw) ;
|
|
XtVaSetValues(w, DtNcolumns, 132, NULL) ;
|
|
vtw->vt.td->col132Mode = True ;
|
|
}
|
|
break;
|
|
case 4: /* Scroll (smooth) */
|
|
_DtTermPrimScrollComplete(w, True) ;
|
|
vtw->term.jumpScroll = False ;
|
|
break;
|
|
case 5: /* Screen (Reverse) */
|
|
/*DKS: this is just to test out the functionality... */
|
|
vtw->term.reverseVideo = True;
|
|
/* clear the window to force refresh... */
|
|
(void) XClearArea(XtDisplay(w), XtWindow(w),
|
|
0, 0, 0, 0, True);
|
|
break;
|
|
case 6: /* Origin mode (On) */
|
|
vtw->vt.td->originMode=True;
|
|
_DtTermPrimCursorMove(w, TOPMARGIN(vtw), 0);
|
|
break;
|
|
case 7: /* Auto wrap (On) */
|
|
vtw->term.tpd->autoWrapRight=True ;
|
|
break;
|
|
/* case 8: ** Auto repeat (On)
|
|
* ** This is handled by the X server
|
|
* break;
|
|
*
|
|
* case 18: ** Print form feed (On)
|
|
* break;
|
|
* case 19: ** Print extent (full screen)
|
|
* break;
|
|
*/
|
|
case 25: /* Text cursor enable (On) */
|
|
(void) _DtTermPrimSetCursorVisible(w, True);
|
|
break;
|
|
/* from xterm */
|
|
case 40: /* 80/132 mode (allow) */
|
|
vtw->vt.c132 = True ;
|
|
break;
|
|
case 41: /* curses fix */
|
|
vtw->vt.td->fixCursesMode = True ;
|
|
break;
|
|
case 44: /* margin bell (on) */
|
|
vtw->term.marginBell = True ;
|
|
break;
|
|
case 45: /* Reverse-wraparound mode */
|
|
vtw->vt.td->reverseWrapMode=True;
|
|
break;
|
|
case 46: /* logging (start) */
|
|
vtw->term.logging = True ;
|
|
_DtTermPrimStartLog(w);
|
|
break;
|
|
/* case 47: ** screen buffer (alternate)
|
|
* break;
|
|
* case 1000: ** Send mouse x and y
|
|
* break;
|
|
* case 1001: ** Use hilite mouse tracking
|
|
* break;
|
|
*/
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
_DtTermPModeReset(Widget w) /* DECRST CSI?pl */
|
|
{
|
|
ParserContext context ;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermWidget vtw = (DtTermWidget)w;
|
|
int i,cnt ;
|
|
Debug ('P', fprintf(stderr,">>In func _DtTermPModeReset\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
/* from vt220 */
|
|
case 1: /* Cursor key (Normal) */
|
|
vtw->vt.td->applicationMode=False;
|
|
break;
|
|
/* case 2: ** set vt52 mode */
|
|
case 3: /* Column (80) */
|
|
if (vtw->vt.c132) { /* allow 132 mode */
|
|
(void) _DtTermFuncClearBuffer(w, 0, fromParser);
|
|
vtw->term.tpd->cursorRow = TOPROW(vtw) ;
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(vtw) ;
|
|
vtw->term.tpd->scrollLockTopRow = TOPROW(vtw);
|
|
vtw->term.tpd->scrollLockBottomRow = BOTTOMROW(vtw) ;
|
|
XtVaSetValues(w, DtNcolumns, 80, NULL) ;
|
|
vtw->vt.td->col132Mode = False ;
|
|
}
|
|
break;
|
|
case 4: /* Scroll (jump) */
|
|
_DtTermPrimScrollComplete(w, True) ;
|
|
vtw->term.jumpScroll = True ;
|
|
break;
|
|
case 5: /* Screen (normal ) */
|
|
/*DKS: this is just to test out the functionality... */
|
|
vtw->term.reverseVideo = False;
|
|
/* clear the window to force refresh... */
|
|
(void) XClearArea(XtDisplay(w), XtWindow(w),
|
|
0, 0, 0, 0, True);
|
|
break;
|
|
case 6: /* Normal cursor (not Origin mode) */
|
|
vtw->vt.td->originMode=False;
|
|
_DtTermPrimCursorMove(w, 0, 0);
|
|
break;
|
|
case 7: /* Auto wrap (Off) */
|
|
vtw->term.tpd->autoWrapRight=False;
|
|
break;
|
|
/* case 8: ** Auto repeat (Off)
|
|
* ** implemented in the server
|
|
* break;
|
|
* case 18: ** Print form feed (Off)
|
|
* break;
|
|
* case 19: ** Print extent (scrolling region)
|
|
* break;
|
|
*/
|
|
case 25: /* Text cursor enable (Off) */
|
|
(void) _DtTermPrimSetCursorVisible(w, False);
|
|
break;
|
|
/* from xterm */
|
|
case 40: /* 80/132 mode (disallow) */
|
|
vtw->vt.c132 = False;
|
|
break;
|
|
case 41: /* curses fix */
|
|
vtw->vt.td->fixCursesMode = False;
|
|
break;
|
|
case 44: /* margin bell (off) */
|
|
vtw->term.marginBell = False ;
|
|
break;
|
|
case 45: /* Reverse-wraparound mode */
|
|
vtw->vt.td->reverseWrapMode=False;
|
|
break;
|
|
case 46: /* logging (stop ) */
|
|
vtw->term.logging = False ;
|
|
_DtTermPrimCloseLog(w) ;
|
|
break;
|
|
/* case 47: ** screen buffer (normal)
|
|
* break;
|
|
* case 1000: ** don't send mouse x and y
|
|
* break;
|
|
* case 1001: ** don't use hilite mouse tracking
|
|
* break;
|
|
*/
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermSetMode(Widget w) /* SM CSIph */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
int i,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSetMode\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
case 2: /* KAM Keyboard Action (locked) */
|
|
vtw->term.tpd->keyboardLocked.escape=True ;
|
|
(void) _DtTermPrimInvokeStatusChangeCallback(w);
|
|
break;
|
|
case 4: /* Insert mode */
|
|
_DtTermPrimInsertCharUpdate(w, DtTERM_INSERT_CHAR_ON) ;
|
|
break;
|
|
case 12: /* SRM Send/Receive (Off) */
|
|
vtw->term.tpd->halfDuplex = False;
|
|
break;
|
|
case 20: /* Line feed/newline (new line) */
|
|
vtw->term.tpd->autoLineFeed=True ;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermResetMode(Widget w) /* RM CSIpl */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
int i,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermResetMode\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
case 2: /* KAM Keyboard Action (unlocked) */
|
|
vtw->term.tpd->keyboardLocked.escape=False;
|
|
(void) _DtTermPrimInvokeStatusChangeCallback(w);
|
|
break;
|
|
case 4: /* Replace mode */
|
|
_DtTermPrimInsertCharUpdate(w, DtTERM_INSERT_CHAR_OFF) ;
|
|
break;
|
|
case 12: /* SRM Send/Receive (On) */
|
|
vtw->term.tpd->halfDuplex = True;
|
|
break;
|
|
case 20: /* Line feed/newline (line feed) */
|
|
vtw->term.tpd->autoLineFeed=False ;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermCursorPos(Widget w) /* CUP CSIp;pH */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int row, col;
|
|
Debug( 'P', fprintf(stderr,">>In func _DtTermCursorPos\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
row = context->parms[1] ;
|
|
col = context->parms[2] ;
|
|
if (row)row-=BASE ;
|
|
if (col)col-=BASE ;
|
|
if (vtw->vt.td->originMode) row += vtw->term.tpd->scrollLockTopRow ;
|
|
if (row > FLOOR(vtw)) row = FLOOR(vtw) ;
|
|
if (col > LASTCOLUMN(vtw)) col = LASTCOLUMN(vtw) ;
|
|
vtw->term.tpd->cursorRow = row ;
|
|
vtw->term.tpd->cursorColumn = col ;
|
|
}
|
|
|
|
void
|
|
_DtTermEraseDisplay(Widget w) /* ED CSIpJ */
|
|
{
|
|
int cnt ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
DtEraseMode eraseMode;
|
|
int row, col;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermEraseDisplay\n")) ;
|
|
context = GetParserContext(w) ;
|
|
KILLWRAP(vtw) ;
|
|
STORELASTARG(context) ;
|
|
row = vtw->term.tpd->cursorRow;
|
|
col = vtw->term.tpd->cursorColumn ;
|
|
|
|
/*
|
|
** pick the correct erase mode...
|
|
*/
|
|
switch (context->parms[1])
|
|
{
|
|
case 0:
|
|
eraseMode = eraseToEOB;
|
|
break;
|
|
case 1:
|
|
eraseMode = eraseFromRow0Col0;
|
|
break;
|
|
case 2:
|
|
eraseMode = eraseBuffer;
|
|
break ;
|
|
}
|
|
_DtTermFuncEraseInDisplay(w, (int)eraseMode, fromParser);
|
|
vtw->term.tpd->cursorRow = row;
|
|
vtw->term.tpd->cursorColumn = col;
|
|
}
|
|
|
|
void
|
|
_DtTermEraseChars(Widget w) /* ECH CSIpX */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int row,col,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermEraseChars\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
row = vtw->term.tpd->cursorRow ;
|
|
col = vtw->term.tpd->cursorColumn ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
if (!(cnt))cnt=1;
|
|
else
|
|
if ( cnt > LASTCOLUMN(vtw)-col+1 ) cnt = LASTCOLUMN(vtw)-col+1 ;
|
|
|
|
_DtTermFuncEraseCharacter(w, cnt, fromParser);
|
|
}
|
|
|
|
void
|
|
_DtTermInsertChars(Widget w) /* ICH CSIp@ */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
int row, col, cnt ;
|
|
DtTermInsertCharMode saveInsertCharMode;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermInsertChars\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
vtw->term.tpd->parserNotInStartState = False ;
|
|
row = vtw->term.tpd->cursorRow ;
|
|
col = vtw->term.tpd->cursorColumn ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
if (!cnt)
|
|
cnt++;
|
|
else
|
|
if (cnt > LASTCOLUMN(vtw) - col + 1)
|
|
cnt = LASTCOLUMN(vtw) - col + 1;
|
|
|
|
/* save away the insert char mode... */
|
|
saveInsertCharMode = vtw->term.tpd->insertCharMode;
|
|
|
|
/* turn on insert char mode. We don't want to invoke any status
|
|
* change callbacks, so we will justs set it directly...
|
|
*/
|
|
vtw->term.tpd->insertCharMode = DtTERM_INSERT_CHAR_ON;
|
|
|
|
/* insert blanks... */
|
|
while (cnt--)
|
|
(void) _DtTermPrimInsertText(w,(unsigned char *) " ", 1) ;
|
|
|
|
/* restore the insert char mode... */
|
|
vtw->term.tpd->insertCharMode = saveInsertCharMode;
|
|
|
|
_DtTermPrimCursorMove(w,row,col) ;
|
|
}
|
|
|
|
void
|
|
_DtTermCursorUp(Widget w) /* CUU CISpA */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int trow, row, tmargin, cnt;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCursorUp\n")) ;
|
|
context = GetParserContext(w) ;
|
|
KILLWRAP(vtw) ;
|
|
tmargin = TOPMARGIN(vtw) ;
|
|
trow = TOPROW(vtw) ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
if (!(cnt))cnt=1;
|
|
else if (cnt>MAXSHORT) cnt=MAXSHORT-100;
|
|
row = vtw->term.tpd->cursorRow-cnt;
|
|
/* are we about the top margin and did we actually cross it? */
|
|
/* This handles the case top margin == top row */
|
|
if (row < tmargin && row+cnt >= tmargin) row = tmargin;
|
|
_DtTermPrimCursorMove(w, row, vtw->term.tpd->cursorColumn) ;
|
|
}
|
|
|
|
void
|
|
_DtTermCursorDown(Widget w) /* CUD CISpB */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int bmargin, row, cnt, brow ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCursorDown\n")) ;
|
|
context = GetParserContext(w) ;
|
|
KILLWRAP(vtw) ;
|
|
bmargin = BOTTOMMARGIN(vtw) ;
|
|
brow = BOTTOMROW(vtw) ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
if (!(cnt))cnt=1;
|
|
row = vtw->term.tpd->cursorRow+cnt;
|
|
/* are we below bottom margin and did we actually cross it? */
|
|
/* NOTE that this also handles the case when bmargin == brow */
|
|
if (row > bmargin && row-cnt <= bmargin) row = bmargin;
|
|
/* did we start below bottom margin and cross bottom row? */
|
|
if (row > brow && bmargin < brow ) row = brow;
|
|
_DtTermPrimCursorMove(w, row, vtw->term.tpd->cursorColumn) ;
|
|
}
|
|
|
|
void
|
|
_DtTermCursorForward(Widget w) /* CUF CISpC */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int col,lcol,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCursorForward\n")) ;
|
|
context = GetParserContext(w) ;
|
|
KILLWRAP(vtw) ;
|
|
lcol = LASTCOLUMN(vtw) ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
if (!cnt) cnt=1;
|
|
col = vtw->term.tpd->cursorColumn+cnt;
|
|
if (col>lcol) col=lcol;
|
|
_DtTermPrimCursorMove(w,vtw->term.tpd->cursorRow,col);
|
|
}
|
|
|
|
void
|
|
_DtTermCursorBack(Widget w) /* CUB CISpD */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int i,k,j,row,col,fcol,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCursorBack\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1] ;
|
|
fcol = FIRSTCOLUMN(vtw) ;
|
|
row = vtw->term.tpd->cursorRow;
|
|
col = vtw->term.tpd->cursorColumn;
|
|
if (!cnt) cnt=1;
|
|
if ((col -= cnt) < 0) {
|
|
if(vtw->vt.td->reverseWrapMode && vtw->term.tpd->autoWrapRight) {
|
|
int lastrow = BOTTOMROW(vtw);
|
|
if (vtw->vt.td->originMode) {
|
|
row-=TOPMARGIN(vtw) ;
|
|
lastrow = BOTTOMMARGIN(vtw)-TOPMARGIN(vtw);
|
|
}
|
|
if((i = (j = LASTCOLUMN(vtw) + 1) * row + col) < 0) {
|
|
k = j * (lastrow + 1);
|
|
i += ((-i) / k + 1) * k;
|
|
}
|
|
row = i / j;
|
|
if (vtw->vt.td->originMode) row+=TOPMARGIN(vtw);
|
|
col = i % j;
|
|
} else
|
|
col = 0;
|
|
}
|
|
_DtTermPrimCursorMove(w,row,col);
|
|
}
|
|
|
|
void
|
|
_DtTermCursorToLineUp(Widget w) /* CPL CSIpF */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCursorToLineUp\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(vtw) ;
|
|
_DtTermCursorUp(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermCursorToCol(Widget w) /* CHA CSIpG */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
if (!context->parms[1] ) context->parms[1]=1;
|
|
if (context->parms[1]>tw->term.columns) context->parms[1]=tw->term.columns;
|
|
tw->term.tpd->cursorColumn = context->parms[1] - BASE ;
|
|
}
|
|
|
|
void
|
|
_DtTermEraseInLine(Widget w) /* EL ESC[pK */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
DtEraseMode eraseMode;
|
|
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermEraseInLine\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
/*
|
|
** pick the correct erase mode...
|
|
*/
|
|
switch ( context->parms[1] )
|
|
{
|
|
case 0:
|
|
eraseMode = eraseToEOL;
|
|
break;
|
|
|
|
case 1:
|
|
eraseMode = eraseFromCol0;
|
|
break;
|
|
|
|
case 2:
|
|
eraseMode = eraseLine;
|
|
break;
|
|
|
|
}
|
|
_DtTermFuncEraseInLine(w, (int)eraseMode, fromParser);
|
|
}
|
|
|
|
void
|
|
_DtTermInsertLines(Widget w) /* IL CSIpL */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
int lines , cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermInsertLines\n")) ;
|
|
if ( vtw->term.tpd->cursorRow < TOPMARGIN(vtw) ||
|
|
vtw->term.tpd->cursorRow > BOTTOMMARGIN(vtw) )/*outside scrolling region*/
|
|
return ;
|
|
context = GetParserContext(w) ;
|
|
KILLWRAP((DtTermWidget)w) ;
|
|
STORELASTARG(context) ;
|
|
cnt=context->parms[1];
|
|
if (!cnt)cnt++;
|
|
lines = BOTTOMMARGIN(vtw) - vtw->term.tpd->cursorRow + 1;
|
|
if (cnt > lines) cnt=lines ;
|
|
_DtTermFuncInsertLine(w,cnt,fromParser) ;
|
|
}
|
|
|
|
void
|
|
_DtTermDeleteLines(Widget w) /* DL CSIpM */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDeleteLines\n")) ;
|
|
|
|
if ( vtw->term.tpd->cursorRow < TOPMARGIN(vtw) ||
|
|
vtw->term.tpd->cursorRow > BOTTOMMARGIN(vtw) ) /* outside scrolling region*/
|
|
return ;
|
|
KILLWRAP((DtTermWidget)w) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = context->parms[1];
|
|
if(!cnt)cnt++;
|
|
_DtTermFuncDeleteLine(w,cnt,fromParser) ;
|
|
}
|
|
|
|
void
|
|
_DtTermDeleteChars(Widget w) /* DCH CSIpP */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDeleteChars\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt= context->parms[1];
|
|
if (!cnt) cnt++;
|
|
else if (cnt>MAXSHORT) cnt=MAXSHORT-100;
|
|
_DtTermFuncDeleteChar(w,cnt,fromParser) ;
|
|
}
|
|
|
|
void
|
|
_DtTermNextLine(Widget w) /* NEL ESCE */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int brow;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermNextLine\n")) ;
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(vtw) ;
|
|
_DtTermIndex(w) ; /* use IND */
|
|
}
|
|
|
|
void
|
|
_DtTermReverseIndex(Widget w) /* RI ESCM */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int tmargin, trow, col;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermReverseIndex\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
trow = TOPROW(vtw) ;
|
|
tmargin = TOPMARGIN(vtw) ;
|
|
col = vtw->term.tpd->cursorColumn ;
|
|
if ( vtw->term.tpd->cursorRow == tmargin) {
|
|
_DtTermFuncInsertLine(w,1,fromParser) ;
|
|
/* _DtTermFuncInsertLine sets column to first column */
|
|
vtw->term.tpd->cursorColumn = col ;
|
|
}
|
|
else if (vtw->term.tpd->cursorRow > trow){
|
|
vtw->term.tpd->cursorRow-- ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermIndex(Widget w) /* IND ESCD */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int bmargin, brow ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermIndex\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
brow = BOTTOMROW(vtw) ;
|
|
bmargin = BOTTOMMARGIN(vtw) ;
|
|
if ( vtw->term.tpd->cursorRow == bmargin) {
|
|
(void) _DtTermPrimScrollText(w, 1);
|
|
}
|
|
else if (vtw->term.tpd->cursorRow < brow){
|
|
vtw->term.tpd->cursorRow++ ;
|
|
}
|
|
(void) _DtTermPrimFillScreenGap(w);
|
|
}
|
|
|
|
void
|
|
_DtTermScrollingRegion(Widget w) /* DECSTBM CSIp;pr */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
ParserContext context ;
|
|
int row1,row2 ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermScrollingRegion\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
row1 = context->parms[1] ;
|
|
row2 = context->parms[2] ;
|
|
if (!row1) row1 = 1 ;
|
|
if (!row2 || row2>vtw->term.rows) row2 = vtw->term.rows ;
|
|
row1-=BASE ;
|
|
row2-=BASE ;
|
|
if ( row1 < row2 ) {
|
|
if ( row1 == TOPROW(vtw) && row2 == BOTTOMROW(vtw))
|
|
vtw->term.tpd->memoryLockMode=SCROLL_LOCKoff ;
|
|
else
|
|
vtw->term.tpd->memoryLockMode=SCROLL_LOCKon ;
|
|
vtw->term.tpd->scrollLockTopRow = row1 ;
|
|
vtw->term.tpd->scrollLockBottomRow = row2 ;
|
|
if (vtw->vt.td->originMode) _DtTermPrimCursorMove(w,row1,0) ;
|
|
else _DtTermPrimCursorMove(w,0,0) ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermCharAttributes(Widget w) /* SGR CSIpm */
|
|
{
|
|
ParserContext context ;
|
|
int i,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermCharAttributes\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
if(PCOUNT(context)) {
|
|
for (cnt=1; cnt <= PCOUNT(context); cnt++)
|
|
_DtTermVideoEnhancement(w,context->parms[cnt]) ;
|
|
}
|
|
else
|
|
_DtTermVideoEnhancement(w,0) ;
|
|
}
|
|
|
|
void
|
|
_DtTermDeviceAttributes(Widget w) /* DA CSIpc */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
ParserContext context ;
|
|
int cnt ;
|
|
char buf[50];
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDeviceAttributes\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
switch(context->parms[1]) {
|
|
case 0:
|
|
switch(vtw->vt.td->terminalId ) {
|
|
case 100:
|
|
sprintf(buf,"\033[?%d;%dc",1,2) ;
|
|
break;
|
|
case 101:
|
|
sprintf(buf,"\033[?%d;%dc",1,0) ;
|
|
break;
|
|
case 102:
|
|
sprintf(buf,"\033[?%dc",6) ;
|
|
break;
|
|
case 220:
|
|
/* class 2 terminal (62), 132 columns (1), printer port (2),
|
|
* selective erase (6), DRCS (7), UDK (8),
|
|
* national replacement char sets
|
|
*/
|
|
sprintf(buf,"\033[?%d;%d;%d;%d;%d;%d;%dc",62,1,2,6,7,8,9) ;
|
|
break;
|
|
}
|
|
sendEscSequence(w,buf) ;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermChangeTextParam(Widget w) /* xterm CSIp;pcCtrl-G */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget tw = (DtTermWidget) w;
|
|
DtTermData vtd = tw->vt.td;
|
|
Widget sw;
|
|
int i ;
|
|
Arg arg[5];
|
|
Debug('P', fprintf(stderr,">>In func _DtTermChangeTextParam\n")) ;
|
|
context = GetParserContext(w) ;
|
|
i=0;
|
|
for (sw = w; !XtIsShell(sw); sw = XtParent(sw));
|
|
/*
|
|
* context->parms[1] is inited to 0, so if no numeric param was entered,
|
|
* we default appropriately to case 0.
|
|
*/
|
|
switch(context->parms[1]) {
|
|
case 0: /* change Icon name and Window title */
|
|
XtSetArg(arg[i], XmNtitle, context->stringParms[0].str); i++;
|
|
XtSetArg(arg[i], XmNiconName, context->stringParms[0].str); i++;
|
|
XtSetValues(sw,arg,i) ;
|
|
break;
|
|
case 1: /* change Icon name */
|
|
XtSetArg(arg[i], XmNiconName, context->stringParms[0].str); i++;
|
|
XtSetValues(sw,arg,i) ;
|
|
break;
|
|
case 2: /* change Window title */
|
|
XtSetArg(arg[i], XmNtitle, context->stringParms[0].str); i++;
|
|
XtSetValues(sw,arg,i) ;
|
|
break;
|
|
case 3: /* change current working directory */
|
|
tw->term.subprocessCWD = XtRealloc(tw->term.subprocessCWD,
|
|
strlen((char *) context->stringParms[0].str) + 1);
|
|
(void) strcpy(tw->term.subprocessCWD,
|
|
(char *) context->stringParms[0].str);
|
|
break;
|
|
/* These are handled by xterm but not by us.
|
|
case 46: Change log file to context->stringParms[0]
|
|
break;
|
|
case 50: ** change font to context->stringParms[0]
|
|
break;
|
|
*/
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermTabClear(Widget w) /* TBC CSIpg */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
TermBuffer tb = tw->term.tpd->termBuffer ;
|
|
ParserContext context ;
|
|
int type ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermTabClear\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
type = context->parms[1] ;
|
|
switch ( type ) {
|
|
case 0:(void)_DtTermPrimBufferClearTab(tb,tw->term.tpd->cursorColumn) ;
|
|
break ;
|
|
case 3: (void)_DtTermPrimBufferClearAllTabs(tb) ;
|
|
break ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermRequestParam(Widget w) /* DECREQTPARM CSIpx */
|
|
{
|
|
ParserContext context ;
|
|
int row ;
|
|
char buf[100];
|
|
Debug('P', fprintf(stderr,">>In func _DtTermRequestParam\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
row = context->parms[1] ;
|
|
if ( row < 2) {
|
|
row += 2;
|
|
|
|
/* row (?), 1 no parity, 1 eight bits, 112 xmit 9600 baud,
|
|
* 112, receive 9600 baud, 1 clock multiplier (?),
|
|
* 0 STP flags (?) These are from xterm file 'charproc.c'.
|
|
*/
|
|
sprintf(buf,"\033[%d;%d;%d;%d;%d;%d;%dx",row,1,1,112,112,1,0) ;
|
|
sendEscSequence(w,buf) ;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
_DtTermTabSet(Widget w) /* HTS ESCH */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
TermBuffer tb = tw->term.tpd->termBuffer ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermTabSet\n")) ;
|
|
(void)_DtTermPrimBufferSetTab(tb,tw->term.tpd->cursorColumn) ;
|
|
}
|
|
|
|
void
|
|
_DtTermSaveCursor(Widget w) /* DECSC ESC7 */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermBuffer tb = (DtTermBuffer)tw->term.tpd->termBuffer ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSaveCursor\n")) ;
|
|
vtd->saveCursor.cursorRow = vtw->term.tpd->cursorRow ;
|
|
vtd->saveCursor.cursorColumn = vtw->term.tpd->cursorColumn ;
|
|
vtd->saveCursor.originMode = vtw->vt.td->originMode ;
|
|
/* The following is save at the TermPrim level */
|
|
/* vtw->vt.td->saveCursor.wrapMode = */
|
|
vtd->saveCursor.enhVideoState = vtd->enhVideoState ;
|
|
vtd->saveCursor.enhFieldState = vtd->enhFieldState ;
|
|
vtd->saveCursor.enhFgColorState = vtd->enhFgColorState;
|
|
vtd->saveCursor.enhBgColorState = vtd->enhBgColorState;
|
|
vtd->saveCursor.GL = vtd->GL;
|
|
vtd->saveCursor.GR = vtd->GR;
|
|
vtd->saveCursor.G0 = vtd->G0;
|
|
vtd->saveCursor.G1 = vtd->G1;
|
|
vtd->saveCursor.G2 = vtd->G2;
|
|
vtd->saveCursor.G3 = vtd->G3;
|
|
vtd->saveCursor.singleShiftFont = vtd->singleShiftFont;
|
|
vtd->saveCursor.singleShiftPending = vtd->singleShiftPending;
|
|
}
|
|
|
|
void
|
|
_DtTermRestoreCursor(Widget w) /* DECRC ESC8 */
|
|
{
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermRestoreCursor\n")) ;
|
|
tpd->cursorRow = vtd->saveCursor.cursorRow ;
|
|
tpd->cursorColumn = vtd->saveCursor.cursorColumn ;
|
|
vtw->vt.td->originMode = vtd->saveCursor.originMode ;
|
|
tpd->autoWrapRight = vtd->saveCursor.wrapMode ;
|
|
vtd->enhVideoState = vtd->saveCursor.enhVideoState ;
|
|
vtd->enhFieldState = vtd->saveCursor.enhFieldState ;
|
|
vtd->enhFgColorState = vtd->saveCursor.enhFgColorState;
|
|
vtd->enhBgColorState = vtd->saveCursor.enhBgColorState;
|
|
vtd->GR = vtd->saveCursor.GR;
|
|
vtd->GL = vtd->saveCursor.GL;
|
|
vtd->G0 = vtd->saveCursor.G0;
|
|
vtd->G1 = vtd->saveCursor.G1;
|
|
vtd->G2 = vtd->saveCursor.G2;
|
|
vtd->G3 = vtd->saveCursor.G3;
|
|
vtd->singleShiftFont = vtd->saveCursor.singleShiftFont;
|
|
vtd->singleShiftPending = vtd->saveCursor.singleShiftPending;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhVideo,
|
|
vtd->enhVideoState);
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhField,
|
|
vtd->enhFieldState);
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhFont,
|
|
*(vtd->GL));
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhBgColor,
|
|
vtd->saveCursor.enhBgColorState);
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhFgColor,
|
|
vtd->saveCursor.enhFgColorState);
|
|
if ( vtd->originMode ) {
|
|
if (tpd->cursorRow < tpd->scrollLockTopRow )
|
|
tpd->cursorRow = tpd->scrollLockTopRow ;
|
|
else if (tpd->cursorRow > tpd->scrollLockBottomRow )
|
|
tpd->cursorRow = tpd->scrollLockBottomRow ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermAppKeypad(Widget w) /* DECPAM ESC= */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermAppKeypad\n")) ;
|
|
vtw->vt.td->applicationKPMode=True;
|
|
}
|
|
|
|
void
|
|
_DtTermNormalKeypad(Widget w) /* DECPNM ESC> */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermNormalKeypad\n")) ;
|
|
vtw->vt.td->applicationKPMode=False;
|
|
}
|
|
|
|
void
|
|
_DtTermS8C1T(Widget w) /* S8C1T ESCG */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Debug('P', fprintf(stderr,">>In func _vt8CIT\n")) ;
|
|
vtw->vt.td->S8C1TMode=True;
|
|
}
|
|
|
|
void
|
|
_DtTermS7C1T(Widget w) /* S7C1T ESCF */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Debug('P', fprintf(stderr,">>In func _vt8CIT\n")) ;
|
|
vtw->vt.td->S8C1TMode=False;
|
|
}
|
|
|
|
void
|
|
_DtTermSetCompatLevel(Widget w) /* DECSCL CSI p;p"p (last p literal) */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSetCompatLevel\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
vtw->vt.td->compatLevel= 2; /* assume vt200 mode */
|
|
switch ( PCOUNT(context) ) {
|
|
case 1: switch (context->parms[1]) {
|
|
case 61: vtw->vt.td->compatLevel= 1;
|
|
vtw->vt.td->S8C1TMode=False;
|
|
break;
|
|
case 62: vtw->vt.td->S8C1TMode=True;
|
|
break;
|
|
}
|
|
break;
|
|
case 2: switch (context->parms[2]) {
|
|
case 0:
|
|
case 2: vtw->vt.td->S8C1TMode=True;
|
|
break;
|
|
case 1:
|
|
vtw->vt.td->S8C1TMode=False;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermInvokeG3(Widget w) /* LS3R ESC| */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermInvokeG3\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermInvokeG2(Widget w) /* LS3R ESC} */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermInvokeG2\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermScrollUp(Widget w) /* SU CSIpS */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int row,col,cnt ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermScrollUp\n")) ;
|
|
#define EXIT_IF_OUTSIDE_SR(w) if((w)->term.tpd->scrollLockTopRow > \
|
|
(w)->term.tpd->cursorRow || \
|
|
(w)->term.tpd->scrollLockBottomRow < \
|
|
(w)->term.tpd->cursorRow) \
|
|
return;
|
|
EXIT_IF_OUTSIDE_SR(vtw)
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
row = vtw->term.tpd->cursorRow;
|
|
col = vtw->term.tpd->cursorColumn;
|
|
STORELASTARG(context) ;
|
|
if (!context->parms[1])
|
|
context->parms[1] = 1;
|
|
else if (context->parms[1] > MAXSHORT)
|
|
context->parms[1] = MAXSHORT - 100;
|
|
|
|
/* clip the number of rows to the scroll region... */
|
|
if (context->parms[1] > (vtw->term.tpd->scrollLockBottomRow -
|
|
vtw->term.tpd->scrollLockTopRow + 1)) {
|
|
context->parms[1] = vtw->term.tpd->scrollLockBottomRow -
|
|
vtw->term.tpd->scrollLockTopRow + 1;
|
|
}
|
|
|
|
vtw->term.tpd->cursorRow = TOPMARGIN(vtw) ;
|
|
_DtTermFuncDeleteLine(w, context->parms[1], fromParser);
|
|
vtw->term.tpd->cursorRow = row;
|
|
vtw->term.tpd->cursorColumn = col;
|
|
}
|
|
|
|
void
|
|
_DtTermScrollDown(Widget w) /* SD CSIpT */
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int row,col,cnt ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermScrollDown\n")) ;
|
|
EXIT_IF_OUTSIDE_SR(vtw)
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
row = vtw->term.tpd->cursorRow;
|
|
col = vtw->term.tpd->cursorColumn ;
|
|
STORELASTARG(context) ;
|
|
if (!context->parms[1])
|
|
context->parms[1] = 1;
|
|
else if (context->parms[1] > MAXSHORT)
|
|
context->parms[1] = MAXSHORT - 100;
|
|
|
|
/* clip the number of rows to the scroll region... */
|
|
if (context->parms[1] > (vtw->term.tpd->scrollLockBottomRow -
|
|
vtw->term.tpd->scrollLockTopRow) + 1) {
|
|
context->parms[1] = vtw->term.tpd->scrollLockBottomRow -
|
|
vtw->term.tpd->scrollLockTopRow + 1;
|
|
}
|
|
|
|
vtw->term.tpd->cursorRow = TOPMARGIN(vtw) ;
|
|
_DtTermFuncInsertLine(w, context->parms[1], fromParser) ;
|
|
vtw->term.tpd->cursorRow = row;
|
|
vtw->term.tpd->cursorColumn = col;
|
|
}
|
|
|
|
void
|
|
_DtTermRestoreModeValues(Widget w) /* xterm - Restore DEC mode values CSI?pr */
|
|
{
|
|
ParserContext context ;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermWidget vtw = (DtTermWidget)w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
int i,cnt ;
|
|
Debug ('P', fprintf(stderr,">>In func _DtTermPModeReset\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
/* from vt220 */
|
|
case 1: /* Cursor key (Normal/Application) */
|
|
vtd->applicationMode = vtd->saveDECMode.applicationMode ;
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 2: /* set vt52 mode */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
case 3: /* Columns (80/132) */
|
|
vtd->col132Mode = vtd->saveDECMode.col132Mode ;
|
|
break;
|
|
case 4: /* Scroll Mode ( jump/smooth ) */
|
|
_DtTermPrimScrollComplete(w, True) ;
|
|
vtw->term.jumpScroll = vtd->saveDECMode.jumpScrollMode ;
|
|
break;
|
|
case 5: /* Screen mode */
|
|
vtw->term.reverseVideo = vtd->saveDECMode.inverseVideoMode ;
|
|
break;
|
|
case 6: /* Origin mode (on/off)*/
|
|
vtd->originMode = vtd->saveDECMode.originMode ;
|
|
break;
|
|
case 7: /* Auto wrap (On/Off) */
|
|
vtw->term.tpd->autoWrapRight = vtd->saveDECMode.wrapMode ;
|
|
break;
|
|
case 8: /* Auto repeat (Off) */
|
|
/* implemented in the server */
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 18: /* Print form feed (Off) */
|
|
break;
|
|
case 19: /* Print extent (scrolling region) */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
case 25: /* Text cursor enable (Off) */
|
|
_DtTermPrimSetCursorVisible(w,
|
|
vtd->saveDECMode.cursorVisible);
|
|
break;
|
|
|
|
/* from xterm */
|
|
case 40: /* 80/132 mode (disallow/allow) */
|
|
vtw->vt.c132 = vtd->saveDECMode.allow80_132ColMode;
|
|
break;
|
|
case 41: /* curses fix (off/on) */
|
|
vtd->fixCursesMode = vtd->saveDECMode.fixCursesMode;
|
|
break;
|
|
case 44: /* margin bell (off/on) */
|
|
vtw->term.marginBell = vtd->saveDECMode.marginBellMode;
|
|
break;
|
|
case 45: /* Reverse-wraparound mode */
|
|
vtd->reverseWrapMode = vtd->saveDECMode.reverseWrapMode ;
|
|
break;
|
|
case 46: /* logging (stop/start ) */
|
|
if (vtd->saveDECMode.logging) {
|
|
vtw->term.logging = True ;
|
|
_DtTermPrimStartLog(w);
|
|
} else {
|
|
vtw->term.logging = False ;
|
|
_DtTermPrimCloseLog(w) ;
|
|
}
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 47: /* screen buffer (normal) */
|
|
break;
|
|
case 1000: /* don't send mouse x and y */
|
|
break;
|
|
case 1001: /* don't use hilite mouse tracking */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermSaveModeValues(Widget w) /* xterm - Save DEC mode values CSI?ps */
|
|
{
|
|
ParserContext context ;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermWidget vtw = (DtTermWidget)w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
int i,cnt ;
|
|
Debug ('P', fprintf(stderr,">>In func _DtTermPModeReset\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
cnt = PCOUNT(context) ;
|
|
for (i=1;i<=cnt;i++) {
|
|
switch ( context->parms[i]) {
|
|
/* from vt220 */
|
|
case 1: /* Cursor key (Normal/Application) */
|
|
vtd->saveDECMode.applicationMode = vtd->applicationMode ;
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 2: /* set vt52 mode */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
case 3: /* Columns (80/132) */
|
|
vtd->saveDECMode.col132Mode = vtd->col132Mode ;
|
|
break;
|
|
case 4: /* Scroll Mode ( jump/smooth ) */
|
|
vtd->saveDECMode.jumpScrollMode = vtw->term.jumpScroll ;
|
|
break;
|
|
case 5: /* Screen mode */
|
|
vtd->saveDECMode.inverseVideoMode = vtw->term.reverseVideo ;
|
|
break;
|
|
case 6: /* Origin mode (on/off)*/
|
|
vtd->saveDECMode.originMode = vtd->originMode ;
|
|
break;
|
|
case 7: /* Auto wrap (On/Off) */
|
|
vtd->saveDECMode.wrapMode = vtw->term.tpd->autoWrapRight ;
|
|
break;
|
|
case 8: /* Auto repeat (Off) */
|
|
/* implemented in the server */
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 18: /* Print form feed (Off) */
|
|
break;
|
|
case 19: /* Print extent (scrolling region) */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
case 25: /* Text cursor enable (Off) */
|
|
vtd->saveDECMode.cursorVisible =
|
|
_DtTermPrimGetCursorVisible(w);
|
|
break;
|
|
/* from xterm */
|
|
case 40: /* 80/132 mode (disallow/allow) */
|
|
vtd->saveDECMode.allow80_132ColMode = vtw->vt.c132;
|
|
break;
|
|
case 41: /* curses fix (off/on) */
|
|
vtd->saveDECMode.fixCursesMode = vtd->fixCursesMode ;
|
|
break;
|
|
case 44: /* margin bell (off/on) */
|
|
vtd->saveDECMode.marginBellMode = vtw->term.marginBell ;
|
|
break;
|
|
case 45: /* Reverse-wraparound mode */
|
|
vtd->saveDECMode.reverseWrapMode = vtd->reverseWrapMode ;
|
|
break;
|
|
case 46: /* logging (stop/start ) */
|
|
vtd->saveDECMode.logging = vtw->term.logging;
|
|
break;
|
|
#ifdef NOT_SUPPORTED
|
|
case 47: /* screen buffer (normal) */
|
|
break;
|
|
case 1000: /* don't send mouse x and y */
|
|
break;
|
|
case 1001: /* don't use hilite mouse tracking */
|
|
break;
|
|
#endif /* NOT_SUPPORTED */
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
_DtTermAlignTest(Widget w) /* DECALN ESC#8 */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int tlrow, blrow, cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermAlignTest\n")) ;
|
|
vtw->term.tpd->parserNotInStartState = False ;
|
|
tlrow = vtw->term.tpd->scrollLockTopRow ;
|
|
blrow = vtw->term.tpd->scrollLockBottomRow ;
|
|
vtw->term.tpd->scrollLockTopRow = TOPROW(w) ; ;
|
|
vtw->term.tpd->scrollLockBottomRow = BOTTOMROW(vtw) ;
|
|
cnt = (BOTTOMROW(vtw)+BASE)*(LASTCOLUMN(vtw)+BASE);
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(w) ;
|
|
vtw->term.tpd->cursorRow = TOPROW(w) ;
|
|
while(cnt--) _DtTermPrimInsertText(w,(unsigned char *) "E", 1) ;
|
|
vtw->term.tpd->scrollLockTopRow = tlrow ;
|
|
vtw->term.tpd->scrollLockBottomRow = blrow ;
|
|
vtw->term.tpd->cursorRow = CEILING(vtw) ;
|
|
vtw->term.tpd->cursorColumn = FIRSTCOLUMN(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermInvokeG1(Widget w) /* ESC~ESC */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermInvokeG1\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermSelEraseInLine(Widget w) /* DECSEL ESC?pK */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
TermBuffer tb = tw->term.tpd->termBuffer ;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
DtTermData td = vtw->vt.td;
|
|
ParserContext context ;
|
|
enhValues evalues;
|
|
int c,col1,col2,col,row ;
|
|
short cnt ;
|
|
DtTermInsertCharMode saveInsertCharMode;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSelEraseInLine\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
col1 = FIRSTCOLUMN(vtw) ;
|
|
col2 = LASTCOLUMN(vtw) ;
|
|
switch ( context->parms[1] ) {
|
|
case 0:
|
|
col1= tpd->cursorColumn;
|
|
break;
|
|
case 1:
|
|
col2 = tpd->cursorColumn;
|
|
break;
|
|
case 2:
|
|
break ;
|
|
default:
|
|
return ;
|
|
}
|
|
/* save away the current cursor position... */
|
|
col = tpd->cursorColumn ;
|
|
row = tpd->cursorRow ;
|
|
|
|
/* save away the current insert mode... */
|
|
saveInsertCharMode = vtw->term.tpd->insertCharMode;
|
|
|
|
/* insert char needs to be off... */
|
|
tpd->insertCharMode = DtTERM_INSERT_CHAR_OFF;
|
|
|
|
tpd->parserNotInStartState = False ;
|
|
c = col1;
|
|
|
|
while (c <= col2) {
|
|
(void)_DtTermPrimBufferGetEnhancement(tb, tpd->cursorRow,
|
|
c, &evalues, &cnt, countAll);
|
|
if (!cnt)
|
|
break ;
|
|
if (evalues[(int)enhField] == FIELD_UNPROTECT) {
|
|
(void) _DtTermPrimBufferSetEnhancement(tb, tpd->cursorRow,
|
|
c, enhVideo, evalues[(int)enhVideo]);
|
|
(void) _DtTermPrimBufferSetEnhancement(tb, tpd->cursorRow,
|
|
c, enhFgColor, evalues[(int)enhFgColor]);
|
|
(void) _DtTermPrimBufferSetEnhancement(tb, tpd->cursorRow,
|
|
c, enhBgColor, evalues[(int)enhBgColor]);
|
|
while ((c <= col2) && cnt--) {
|
|
tpd->cursorColumn = c;
|
|
(void) _DtTermPrimInsertText(w, (unsigned char *) " ", 1);
|
|
c++;
|
|
}
|
|
} else {
|
|
c += cnt;
|
|
}
|
|
}
|
|
|
|
/* restore the insert char mode... */
|
|
tpd->insertCharMode = saveInsertCharMode;
|
|
|
|
/* restore the cursor position... */
|
|
tpd->cursorColumn = col;
|
|
tpd->cursorRow = row;
|
|
|
|
/* restore the current enhancement state... */
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhVideo,
|
|
td->enhVideoState);
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhFgColor,
|
|
td->enhFgColorState);
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn, enhBgColor,
|
|
td->enhBgColorState);
|
|
}
|
|
|
|
void
|
|
_DtTermSelEraseInDisplay(Widget w) /* DECSED ESC?pJ */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
TermBuffer tb = tw->term.tpd->termBuffer ;
|
|
ParserContext context ;
|
|
enhValues evalues;
|
|
int r,col1,col2,row1,row2,col,row ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSelEraseInDisplay\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
col1 = FIRSTCOLUMN(vtw) ;
|
|
row1 = TOPROW(vtw) ;
|
|
col2 = LASTCOLUMN(vtw) ;
|
|
row2 = BOTTOMROW(vtw) ;
|
|
switch ( context->parms[1] ) {
|
|
case 0: col1= vtw->term.tpd->cursorColumn;
|
|
row1 = vtw->term.tpd->cursorRow;
|
|
break;
|
|
case 1: col2 = vtw->term.tpd->cursorColumn;
|
|
row2 = vtw->term.tpd->cursorRow;
|
|
break;
|
|
case 2: break ;
|
|
default: return ;
|
|
}
|
|
col = vtw->term.tpd->cursorColumn;
|
|
row = vtw->term.tpd->cursorRow;
|
|
vtw->term.tpd->cursorColumn = col1 ;
|
|
vtw->term.tpd->cursorRow = row1;
|
|
context->workingNum = 0 ; /* erase to the end of line */
|
|
_DtTermSelEraseInLine(w) ;
|
|
context->workingNum = 2 ; /* erase the whole row */
|
|
for ( r=row1+1; r<row2; r++) {
|
|
vtw->term.tpd->cursorRow = r;
|
|
_DtTermSelEraseInLine(w) ;
|
|
}
|
|
vtw->term.tpd->cursorColumn = col2 ;
|
|
vtw->term.tpd->cursorRow = row2;
|
|
context->workingNum = 2 ; /* erase the beginning of the line */
|
|
_DtTermSelEraseInLine(w) ;
|
|
vtw->term.tpd->cursorColumn = col ;
|
|
vtw->term.tpd->cursorRow = row;
|
|
}
|
|
|
|
|
|
void
|
|
_DtTermSingleShiftG2(Widget w) /* SS2 ESCN */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSingleShiftG2\n")) ;
|
|
vtd->singleShiftPending = True;
|
|
vtd->singleShiftFont = vtd->G2;
|
|
}
|
|
|
|
void
|
|
_DtTermSingleShiftG3(Widget w) /* SS3 ESCO */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSingleShiftG3\n")) ;
|
|
vtd->singleShiftPending = True;
|
|
vtd->singleShiftFont = vtd->G3;
|
|
}
|
|
|
|
void
|
|
_DtTermLoadCharSet(Widget w) /* vt220 DCS - download char set ESCPpST */
|
|
{
|
|
/* we're not implementing this */
|
|
}
|
|
|
|
/*********************************************************************
|
|
* The next 3 functions handle the user key string loading
|
|
* DCS Pc;Pl | Ky1/st1;ky2/st2;...kyn/stn ST
|
|
*/
|
|
void
|
|
_DtTermParseUserKeyClear(Widget w) /* vt220 DECUDK clear function keys*/
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
ParserContext context ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermLoadSoftKey\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
if ( !vtd->userKeysLocked )
|
|
{
|
|
vtd->needToLockUserKeys = False ;
|
|
if (context->parms[1] == 0)
|
|
_DtTermFunctionKeyClear(w) ;
|
|
if (context->parms[0] == 2 && context->parms[2] == 0)
|
|
vtd->needToLockUserKeys = True ;
|
|
}
|
|
_DtTermClearParam(w) ;
|
|
}
|
|
void
|
|
_DtTermParseUserKeyLoad(Widget w) /* vt220 DECUDK load function string */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
ParserContext context ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermLoadSoftKey\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
if ( !vtd->userKeysLocked)
|
|
{
|
|
context->stringParms[0].str[context->stringParms[0].length/2] =
|
|
(unsigned char)0 ; /* Null terminate */
|
|
_DtTermFunctionKeyStringStore(w,context->parms[1],
|
|
(char *)context->stringParms[0].str);
|
|
}
|
|
_DtTermClearParam(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermParseUserKeyLoadLast(Widget w) /* vt220 DECUDK load function string */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermData vtd = vtw->vt.td;
|
|
_DtTermParseUserKeyLoad(w);
|
|
if (vtd->needToLockUserKeys) vtd->userKeysLocked = True ;
|
|
vtd->needToLockUserKeys = False ;
|
|
}
|
|
|
|
void
|
|
_DtTermParseHexDigit(Widget w) /* vt220 DECUDK store hex digit*/
|
|
{
|
|
ParserContext context ;
|
|
int ci, left_byte, i;
|
|
char c, cbuf[2] ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermLoadSoftKey\n")) ;
|
|
context = GetParserContext(w) ;
|
|
if ( (int)context->stringParms[0].length < 2*STR_SIZE-1 ) {
|
|
/* fold the hex digits into characters */
|
|
i = context->stringParms[0].length ;
|
|
cbuf[0] = *context->inputChar ;
|
|
cbuf[1] = (char)0 ;
|
|
sscanf(cbuf,"%x",&ci) ;
|
|
c = (char)ci ;
|
|
left_byte = (i+1)%2 ;
|
|
i /= 2 ;
|
|
if ( left_byte )
|
|
context->stringParms[0].str[i] = c<<4 ;
|
|
else
|
|
context->stringParms[0].str[i] |= c & 0x0F ;
|
|
context->stringParms[0].length++ ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermReset(Widget w) /* RIS ESCc */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermReset\n")) ;
|
|
context = GetParserContext(w) ;
|
|
_DtTermFuncHardReset(w,0 ,fromParser) ;
|
|
}
|
|
|
|
void
|
|
_DtTermSelectG2(Widget w) /* LS2 ESCn */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSelectG2\n")) ;
|
|
vtd->GL = &vtd->G2;
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermSelectG3(Widget w) /* LS3 ESCo */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSelectG3\n")) ;
|
|
vtd->GL = &vtd->G3;
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseStatus(Widget w) /* DECID (same as DA) ESCZ */
|
|
{
|
|
_DtTermDeviceAttributes(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermSetCharEraseMode(Widget w) /* DECSCA ESCp"q */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSetCharEraseMode\n")) ;
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
switch ( context->parms[1] ) {
|
|
case 0: /* set back to default which is unprotect */
|
|
/* fall through */
|
|
case 2:
|
|
vtw->vt.td->enhFieldState = FIELD_UNPROTECT;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhField, vtw->vt.td->enhFieldState);
|
|
break;
|
|
case 1:
|
|
vtw->vt.td->enhFieldState = FIELD_PROTECT;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhField, vtw->vt.td->enhFieldState);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermSingleWide(Widget w) /* DECSWL ESC#5 */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSingleWide\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermDoubleWide(Widget w) /* DECDWL ESC#6 */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDoubleWide\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermDoubleHigh(Widget w) /* DECWHL ESC#4 */
|
|
{
|
|
ParserContext context ;
|
|
int cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermDoubleHigh\n")) ;
|
|
context = GetParserContext(w) ;
|
|
}
|
|
|
|
void
|
|
_DtTermParseFontG0(Widget w)
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseFontG0\n")) ;
|
|
switch (*context->inputChar) {
|
|
case 'B':
|
|
vtd->G0 = FONT_NORMAL;
|
|
break;
|
|
|
|
case '0':
|
|
vtd->G0 = FONT_LINEDRAW;
|
|
break;
|
|
}
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseFontG1(Widget w)
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseFontG1\n")) ;
|
|
switch (*context->inputChar) {
|
|
case 'B':
|
|
vtd->G1 = FONT_NORMAL;
|
|
break;
|
|
|
|
case '0':
|
|
vtd->G1 = FONT_LINEDRAW;
|
|
break;
|
|
}
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseFontG2(Widget w)
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseFontG1\n")) ;
|
|
switch (*context->inputChar) {
|
|
case 'B':
|
|
vtd->G2 = FONT_NORMAL;
|
|
break;
|
|
|
|
case '0':
|
|
vtd->G2 = FONT_LINEDRAW;
|
|
break;
|
|
}
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseFontG3(Widget w)
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseFontG1\n")) ;
|
|
switch (*context->inputChar) {
|
|
case 'B':
|
|
vtd->G3 = FONT_NORMAL;
|
|
break;
|
|
|
|
case '0':
|
|
vtd->G3 = FONT_LINEDRAW;
|
|
break;
|
|
}
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseFontShift(Widget w) /* Ctrl-E Ctrl-F */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
DtTermData vtd = vtw->vt.td;
|
|
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
|
DtTermPrimData tpd = tw->term.tpd;
|
|
ParserContext context ;
|
|
context = GetParserContext(w) ;
|
|
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseFontShift\n")) ;
|
|
switch (*context->inputChar) {
|
|
case 'O' & 0x1f:
|
|
/* SHIFT OUT */
|
|
vtd->GL = &vtd->G0;
|
|
break;
|
|
|
|
case 'N' & 0x1f:
|
|
/* SHIFT OUT */
|
|
vtd->GL = &vtd->G1;
|
|
break;
|
|
}
|
|
|
|
vtd->enhFontState = *vtd->GL;
|
|
(void)_DtTermPrimBufferSetEnhancement(tpd->termBuffer,
|
|
tpd->topRow + tpd->cursorRow, tpd->cursorColumn,
|
|
enhFont, vtd->enhFontState);
|
|
}
|
|
|
|
void
|
|
_DtTermParseTab(Widget w) /* Crtl-I */
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseTab\n")) ;
|
|
if (vtw->term.tpd->cursorColumn > LASTCOLUMN(vtw)) {
|
|
if (vtw->vt.td->fixCursesMode) {
|
|
(void) _DtTermNextLine(w);
|
|
(void) _DtTermFuncTab(w, 1, fromParser);
|
|
} else {
|
|
/* we already tabbed to the end of the line, so do nothing... */
|
|
}
|
|
} else {
|
|
(void) _DtTermFuncTab(w, 1, fromParser);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void
|
|
_DtTermParseLF /* LineFeed (LF) or newline (NL) Ctrl-J,
|
|
Vertical Tab Ctrl-K, Form Feed (NP) Ctrl-L */
|
|
(
|
|
Widget w
|
|
)
|
|
{
|
|
DtTermWidget vtw = (DtTermWidget)w ;
|
|
Debug('P', fprintf(stderr,">>In func _vtParseLR\n")) ;
|
|
KILLWRAP(vtw) ;
|
|
if (vtw->term.tpd->cursorRow == BOTTOMMARGIN(vtw))
|
|
{
|
|
/*
|
|
** scroll one line...
|
|
*/
|
|
(void) _DtTermPrimScrollText(w, 1);
|
|
vtw->term.tpd->cursorRow = BOTTOMMARGIN(vtw);
|
|
}
|
|
else {
|
|
if (!(vtw->term.tpd->cursorRow == BOTTOMROW(vtw))) {
|
|
vtw->term.tpd->cursorRow++ ;
|
|
}
|
|
}
|
|
(void) _DtTermPrimFillScreenGap(w);
|
|
|
|
if (vtw->term.tpd->autoLineFeed )
|
|
_DtTermPrimParseCR(w);
|
|
}
|
|
|
|
void
|
|
_DtTermSoftReset /* DECSTR ESC!p */
|
|
(
|
|
Widget w
|
|
)
|
|
{
|
|
Debug('P', fprintf(stderr,">>In func _DtTermSoftReset\n")) ;
|
|
_DtTermFuncSoftReset(w,0 ,fromParser) ;
|
|
}
|
|
|
|
void
|
|
_DtTermParseBackspace /* Ctrl-H */
|
|
(
|
|
Widget w
|
|
)
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
int row,col,fcol,cnt ;
|
|
Debug('P', fprintf(stderr,">>In func _DtTermParseBackspace\n")) ;
|
|
context = GetParserContext(w) ;
|
|
fcol = FIRSTCOLUMN(vtw) ;
|
|
row = vtw->term.tpd->cursorRow;
|
|
col = vtw->term.tpd->cursorColumn;
|
|
(void) col--;
|
|
if (col<fcol) {
|
|
if (vtw->vt.td->reverseWrapMode) {
|
|
if ( --row < TOPROW(vtw)) row = BOTTOMROW(vtw);
|
|
if (vtw->vt.td->originMode && row < TOPMARGIN(vtw))
|
|
row =BOTTOMMARGIN(vtw);
|
|
col = LASTCOLUMN(vtw) ;
|
|
}
|
|
else {
|
|
col=fcol;
|
|
}
|
|
}
|
|
vtw->term.tpd->cursorRow = row;
|
|
vtw->term.tpd->cursorColumn = col;
|
|
}
|
|
|
|
static void
|
|
GetWindowOffsets
|
|
(
|
|
Widget w,
|
|
int *xOffset,
|
|
int *yOffset,
|
|
int *widthOffset,
|
|
int *heightOffset
|
|
)
|
|
{
|
|
Display *display;
|
|
Window parentReturn;
|
|
Window *childrenReturn;
|
|
unsigned int nChildrenReturn;
|
|
Window rootWindow;
|
|
Window topWindow;
|
|
Window childReturn;
|
|
int destXReturn;
|
|
int destYReturn;
|
|
unsigned int widthReturn;
|
|
unsigned int heightReturn;
|
|
unsigned int topWidthReturn;
|
|
unsigned int topHeightReturn;
|
|
unsigned int borderWidthReturn;
|
|
unsigned int depthReturn;
|
|
|
|
*xOffset = 0;
|
|
*yOffset = 0;
|
|
*widthOffset = 0;
|
|
*heightOffset = 0;
|
|
|
|
if (XmIsMotifWMRunning(w)) {
|
|
/* get the window we want to figure the offsets for... */
|
|
topWindow = XtWindow(w);
|
|
|
|
/* and the display involved... */
|
|
display = XtDisplay(w);
|
|
|
|
(void) XQueryTree(display, topWindow, &rootWindow, &parentReturn,
|
|
&childrenReturn, &nChildrenReturn);
|
|
(void) XFree(childrenReturn);
|
|
|
|
/* walk up the tree until the parent window is root... */
|
|
while (parentReturn != rootWindow) {
|
|
topWindow = parentReturn;
|
|
(void) XQueryTree(display, topWindow, &rootWindow,
|
|
&parentReturn, &childrenReturn, &nChildrenReturn);
|
|
(void) XFree(childrenReturn);
|
|
}
|
|
|
|
/* we now know what our top window is. translate our upper
|
|
* left corner relative to its upper left corner...
|
|
*/
|
|
(void) XTranslateCoordinates(display, XtWindow(w), topWindow,
|
|
0, 0, &destXReturn, &destYReturn, &childReturn);
|
|
*xOffset = destXReturn;
|
|
*yOffset = destYReturn;
|
|
|
|
/* now that we know the top window, we can figure out the size
|
|
* difference between the two windows...
|
|
*/
|
|
(void) XGetGeometry(display, topWindow, &rootWindow,
|
|
&destXReturn, &destYReturn, &topWidthReturn,
|
|
&topHeightReturn, &borderWidthReturn, &depthReturn);
|
|
|
|
(void) XGetGeometry(display, XtWindow(w), &rootWindow,
|
|
&destXReturn, &destYReturn, &widthReturn, &heightReturn,
|
|
&borderWidthReturn, &depthReturn);
|
|
|
|
*widthOffset = topWidthReturn - widthReturn;
|
|
*heightOffset = topHeightReturn - heightReturn;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermParseSunMisc /* Misc sun esc seqs */
|
|
(
|
|
Widget w
|
|
)
|
|
{
|
|
ParserContext context ;
|
|
DtTermWidget vtw = (DtTermWidget) w;
|
|
Display *display = XtDisplay(w);
|
|
int i, scr_num = XScreenNumberOfScreen(XtScreen(w));
|
|
Window win = XtWindow(w);
|
|
Window sh_win;
|
|
Widget sw;
|
|
XWindowChanges values;
|
|
Arg arg[5];
|
|
char buf[BUFSIZ];
|
|
Position x,y;
|
|
short rows,columns;
|
|
Dimension height,width;
|
|
char *fmt,*s,*title,*icon;
|
|
int xOffset;
|
|
int yOffset;
|
|
int widthOffset;
|
|
int heightOffset;
|
|
|
|
context = GetParserContext(w) ;
|
|
STORELASTARG(context) ;
|
|
|
|
for (sw = w; !XtIsShell(sw); sw = XtParent(sw));
|
|
sh_win = XtWindow(sw) ;
|
|
switch (context->parms[1])
|
|
{
|
|
case 1:
|
|
XMapWindow(display,sh_win);
|
|
break;
|
|
case 2:
|
|
XIconifyWindow(display,sh_win,scr_num);
|
|
break;
|
|
case 3:
|
|
(void) GetWindowOffsets(sw, &xOffset, &yOffset, &widthOffset,
|
|
&heightOffset);
|
|
/* DKS
|
|
(void) XMoveWindow(display, sh_win,
|
|
context->parms[2] + xOffset, context->parms[3] + yOffset);
|
|
DKS */
|
|
(void) XtVaSetValues(sw, XmNx, context->parms[2] + xOffset,
|
|
XmNy, context->parms[3] + yOffset, NULL);
|
|
break ;
|
|
case 4:
|
|
(void) GetWindowOffsets(sw, &xOffset, &yOffset, &widthOffset,
|
|
&heightOffset);
|
|
(void) XtVaSetValues(sw, XmNwidth, context->parms[3] - widthOffset,
|
|
XmNheight,context->parms[2] - heightOffset, NULL);
|
|
break ;
|
|
case 5:
|
|
XRaiseWindow(display,sh_win);
|
|
break ;
|
|
case 6:
|
|
XLowerWindow(display,sh_win);
|
|
break ;
|
|
case 7:
|
|
_DtTermPrimFuncRedrawDisplay(w, 1, fromParser);
|
|
break ;
|
|
case 8:
|
|
rows = context->parms[2];
|
|
columns = context->parms[3];
|
|
(void) XtVaSetValues(w, DtNrows, rows, DtNcolumns, columns, NULL);
|
|
break ;
|
|
case 11:
|
|
if (vtw->term.tpd->windowMapped)
|
|
sendEscSequence(w,"\033[1t") ;
|
|
else
|
|
sendEscSequence(w,"\033[2t") ;
|
|
break ;
|
|
case 13:
|
|
(void) GetWindowOffsets(sw, &xOffset, &yOffset, &widthOffset,
|
|
&heightOffset);
|
|
(void) XtVaGetValues(sw, XtNx, &x, XtNy, &y, NULL);
|
|
(void) sprintf(buf, "\033[3;%d;%dt", x - xOffset, y - yOffset);
|
|
(void) sendEscSequence(w, buf);
|
|
break;
|
|
case 14:
|
|
(void) GetWindowOffsets(sw, &xOffset, &yOffset, &widthOffset,
|
|
&heightOffset);
|
|
(void) XtVaGetValues(sw, XtNheight, &height, XtNwidth, &width, NULL);
|
|
(void) sprintf(buf,"\033[4;%d;%dt", height + heightOffset,
|
|
width + widthOffset);
|
|
(void) sendEscSequence(w, buf);
|
|
break;
|
|
case 18:
|
|
(void) XtVaGetValues(w, DtNrows, &rows, DtNcolumns, &columns, NULL);
|
|
(void) sprintf(buf, "\033[8;%hd;%hdt", rows, columns);
|
|
(void) sendEscSequence(w, buf);
|
|
break;
|
|
case 20:
|
|
XtVaGetValues(sw,XmNiconName, &icon, NULL);
|
|
fmt = "\033]L%s\033\\";
|
|
if (strlen(icon) + strlen(fmt) + 1 >= sizeof(buf))
|
|
s = XtMalloc(strlen(icon) + strlen(fmt) + 1);
|
|
else
|
|
s = buf;
|
|
sprintf(s, "%s", fmt);
|
|
sendEscSequence(w,s) ;
|
|
if (s != buf) XtFree(s);
|
|
break ;
|
|
case 21:
|
|
XtVaGetValues(sw,XmNtitle, &title, NULL);
|
|
fmt = "\033]l%s\033\\";
|
|
if (strlen(icon) + strlen(fmt) + 1 >= sizeof(buf))
|
|
s = XtMalloc(strlen(icon) + strlen(fmt) + 1);
|
|
else
|
|
s = buf;
|
|
sprintf(s, "%s", fmt);
|
|
sendEscSequence(w,s) ;
|
|
if (s != buf) XtFree(s);
|
|
break ;
|
|
}
|
|
}
|
|
|
|
void
|
|
_DtTermParserSunWindowIcon( Widget w) /* sun set icon label */
|
|
{
|
|
ParserContext context ;
|
|
Widget sw;
|
|
context = GetParserContext(w) ;
|
|
for (sw = w; !XtIsShell(sw); sw = XtParent(sw));
|
|
XtVaSetValues(sw, XmNiconName, context->stringParms[0].str, NULL) ;
|
|
}
|
|
|
|
void
|
|
_DtTermParserSunWindowTitle /* Sun set title name */
|
|
(
|
|
Widget w
|
|
)
|
|
{
|
|
ParserContext context ;
|
|
Widget sw;
|
|
context = GetParserContext(w) ;
|
|
for (sw = w; !XtIsShell(sw); sw = XtParent(sw));
|
|
XtVaSetValues(sw,XmNtitle, context->stringParms[0].str, NULL) ;
|
|
}
|
|
|
|
void
|
|
_DtTermParserSunIconFile(Widget w) /* Sun set icon to pixmap in file */
|
|
{
|
|
DtTermBuffer tb =
|
|
(DtTermBuffer)((DtTermPrimitiveWidget)w)->term.tpd->termBuffer ;
|
|
ParserContext context ;
|
|
int fg, bg;
|
|
Widget sw;
|
|
Pixmap icon;
|
|
|
|
context = GetParserContext(w) ;
|
|
for (sw = w; !XtIsShell(sw); sw = XtParent(sw));
|
|
XtVaGetValues(sw, XtNforeground, &fg, XtNbackground, &bg, NULL);
|
|
icon = XmGetPixmap(XtScreen(sw),(char *)context->stringParms[0].str,fg,bg);
|
|
if (icon != XmUNSPECIFIED_PIXMAP)
|
|
XtVaSetValues(sw, XmNiconPixmap, icon, NULL);
|
|
}
|
|
|