mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Mostly missing headers, explicit parentheses and new prototypes. Some Caveats: * I haven't compile-tested the SVR4 getpty file, it might need another tweak * There were operator precedence bugs in TermPrimCursor.c and TermPrimRender.c (^ vs. !=). This might change behaviour, but at least I haven't experienced any crashes ... * This adds a little more dependencies for include ordering, but unless we want to play the "headers that include headers that include headers..." game, this is unavoidable.
670 lines
19 KiB
C
670 lines
19 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 librararies and programs; if not, write
|
||
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||
* Floor, Boston, MA 02110-1301 USA
|
||
*/
|
||
#ifndef lint
|
||
#ifdef VERBOSE_REV_INFO
|
||
static char rcs_id[] = "$XConsortium: TermAction.c /main/1 1996/04/21 19:15:17 drk $";
|
||
#endif /* VERBOSE_REV_INFO */
|
||
#endif /* lint */
|
||
|
||
/* *
|
||
* (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 "TermHeader.h"
|
||
#include "TermPrimDebug.h"
|
||
#include "TermPrimI.h"
|
||
#include "TermP.h"
|
||
#include "TermPrimData.h"
|
||
/* #include "TermData.h" */
|
||
#include "TermPrimAction.h"
|
||
#include "TermAction.h"
|
||
#include "TermFunction.h"
|
||
#include "TermPrimSetPty.h"
|
||
#include "TermSendEsc.h"
|
||
#ifdef _AIX
|
||
#include <X11/keysym.h>
|
||
#endif /* _AIX */
|
||
|
||
static char *KeypadKey[] = { DT_KP_Space, DT_KP_Tab, DT_KP_Enter, DT_KP_F1,
|
||
DT_KP_F2, DT_KP_F3, DT_KP_F4, DT_KP_Equal,
|
||
DT_KP_Multiply, DT_KP_Add, DT_KP_Separator,
|
||
DT_KP_Subtract, DT_KP_Decimal, DT_KP_Divide,
|
||
DT_KP_0, DT_KP_1, DT_KP_2, DT_KP_3, DT_KP_4,
|
||
DT_KP_5, DT_KP_6, DT_KP_7, DT_KP_8, DT_KP_9};
|
||
static char *AppKeypadKey[] ={KP_APP_Space, KP_APP_Tab, KP_APP_Enter,KP_APP_F1,
|
||
KP_APP_F2, KP_APP_F3, KP_APP_F4, KP_APP_Equal,
|
||
KP_APP_Multiply, KP_APP_Add, KP_APP_Separator,
|
||
KP_APP_Subtract, KP_APP_Decimal, KP_APP_Divide,
|
||
KP_APP_0, KP_APP_1, KP_APP_2, KP_APP_3, KP_APP_4,
|
||
KP_APP_5, KP_APP_6, KP_APP_7, KP_APP_8, KP_APP_9};
|
||
#ifdef OBSOLETE
|
||
static char *EditKey[] = {ESC_FIND, ESC_INSERT_HERE, ESC_DELETE,
|
||
ESC_SELECT, ESC_PREV_SCREEN, ESC_NEXT_SCREEN};
|
||
static char *SunEditKey[] = {ESC_FIND_SUN, ESC_INSERT_HERE_SUN,
|
||
ESC_DELETE_SUN, ESC_SELECT_SUN, ESC_PREV_SCREEN_SUN,
|
||
ESC_NEXT_SCREEN_SUN};
|
||
#endif /* OBSOLETE */
|
||
void
|
||
_DtTermWriteEscSeq(Widget w, char *transmitString)
|
||
{
|
||
DtTermWidget tw = (DtTermWidget)w;
|
||
DtTermData td = tw->vt.td;
|
||
|
||
if (KEYBOARD_LOCKED(td->tpd->keyboardLocked)) {
|
||
/* keyboard locked -- ring the bell...
|
||
*/
|
||
(void) _DtTermPrimBell(w);
|
||
} else
|
||
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));
|
||
}
|
||
return;
|
||
}
|
||
|
||
typedef struct {
|
||
const char *string;
|
||
char value;
|
||
} EnumType;
|
||
|
||
static int
|
||
stringToEnum(char *c, EnumType *enumTypes, int numEnumTypes)
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < numEnumTypes; i++) {
|
||
if (!strcmp(enumTypes[i].string, c))
|
||
return(i);
|
||
}
|
||
|
||
return(-1);
|
||
}
|
||
|
||
|
||
/*** BREAK ********************************************************************
|
||
*
|
||
* ##### ##### ###### ## # #
|
||
* # # # # # # # # #
|
||
* ##### # # ##### # # ####
|
||
* # # ##### # ###### # #
|
||
* # # # # # # # # #
|
||
* ##### # # ###### # # # #
|
||
*/
|
||
|
||
void
|
||
_DtTermActionBreak(Widget w, XEvent *event, String *params, Cardinal *num_params)
|
||
{
|
||
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
||
struct termData *tpd = tw->term.tpd;
|
||
int msec = 0;
|
||
|
||
/* check for keyboardLock... */
|
||
if (KEYBOARD_LOCKED(tpd->keyboardLocked)) {
|
||
(void) _DtTermPrimBell(w);
|
||
return;
|
||
}
|
||
|
||
/* tcsendbreak() , which eventually gets called, has the msec
|
||
parameter but it never actually gets used, so for now, its a dont care
|
||
*/
|
||
|
||
if (tw->term.pty >= 0)
|
||
(void) _DtTermPrimPtySendBreak(tw->term.pty, msec);
|
||
return;
|
||
}
|
||
|
||
|
||
/*** SCROLL *******************************************************************
|
||
*
|
||
* #### #### ##### #### # #
|
||
* # # # # # # # # #
|
||
* #### # # # # # # #
|
||
* # # ##### # # # #
|
||
* # # # # # # # # # #
|
||
* #### #### # # #### ###### ######
|
||
*/
|
||
|
||
|
||
typedef enum {
|
||
scrollPage,
|
||
scrollHalfPage,
|
||
scrollLine,
|
||
scrollPixel
|
||
} ScrollAmount;
|
||
|
||
static EnumType scrollUnits[] = {
|
||
{ "page", (char) scrollPage, },
|
||
{ "halfpage", (char) scrollHalfPage, },
|
||
{ "line", (char) scrollLine },
|
||
};
|
||
|
||
void
|
||
_DtTermActionScroll(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
||
struct termData *tpd = tw->term.tpd;
|
||
int unitsIndex;
|
||
ScrollAmount units;
|
||
int count = 1;
|
||
|
||
if (*num_params >= 1) {
|
||
count = strtol(params[0], (char **) 0, 0);
|
||
}
|
||
|
||
if (*num_params >= 2) {
|
||
unitsIndex = stringToEnum(params[1], scrollUnits,
|
||
XtNumber(scrollUnits));
|
||
if (unitsIndex < 0) {
|
||
/* no match... */
|
||
return;
|
||
}
|
||
units = (ScrollAmount) scrollUnits[unitsIndex].value;
|
||
} else {
|
||
units = scrollLine;
|
||
}
|
||
|
||
/* perform the cursor motion...
|
||
*/
|
||
switch(units) {
|
||
case scrollPage:
|
||
_DtTermFuncScroll(w, count*(tw->term.rows-1), fromAction);
|
||
break;
|
||
|
||
case scrollHalfPage:
|
||
if (count > 0) {
|
||
_DtTermFuncScroll(w, count *
|
||
(tw->term.rows - tpd->memoryLockRow) / 2, fromAction);
|
||
} else {
|
||
_DtTermFuncScroll(w,
|
||
count * (tw->term.rows - tpd->memoryLockRow) / 2,
|
||
fromAction);
|
||
}
|
||
break;
|
||
|
||
case scrollLine:
|
||
_DtTermFuncScroll(w, count, fromAction);
|
||
break;
|
||
}
|
||
return;
|
||
}
|
||
|
||
void
|
||
_DtTermActionBeginningOfBuffer(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
_DtTermFuncBeginningOfBuffer(w,0,1) ;
|
||
(void) _DtTermPrimCursorOn(w);
|
||
return;
|
||
}
|
||
|
||
void
|
||
_DtTermActionEndOfBuffer(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
_DtTermFuncEndOfBuffer(w,0,1) ;
|
||
(void) _DtTermPrimCursorOn(w);
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
/** HARD/SOFT RESET ***********************************************************
|
||
* #
|
||
* # # ## ##### ##### # #### #### ###### #####
|
||
* # # # # # # # # # # # # # #
|
||
* ###### # # # # # # # #### # # ##### #
|
||
* # # ###### ##### # # # # # # # #
|
||
* # # # # # # # # # # # # # # #
|
||
* # # # # # # ##### # #### #### # #
|
||
*
|
||
*
|
||
* ##### ###### #### ###### #####
|
||
* # # # # # #
|
||
* # # ##### #### ##### #
|
||
* ##### # # # #
|
||
* # # # # # # #
|
||
* # # ###### #### ###### #
|
||
*/
|
||
void
|
||
_DtTermActionHardReset(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
(void) _DtTermFuncHardReset(w, 0, fromAction);
|
||
}
|
||
|
||
void
|
||
_DtTermActionSoftReset(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
(void) _DtTermFuncSoftReset(w, 0, fromAction);
|
||
}
|
||
|
||
|
||
/*** INSERT CHAR/LINE *********************************************************
|
||
*
|
||
* # # # #### ###### ##### #####
|
||
* # ## # # # # # #
|
||
* # # # # #### ##### # # #
|
||
* # # # # # # ##### #
|
||
* # # ## # # # # # #
|
||
* # # # #### ###### # # #
|
||
*
|
||
* #
|
||
* #### # # ## ##### # # # # # ######
|
||
* # # # # # # # # # # # ## # #
|
||
* # ###### # # # # # # # # # # #####
|
||
* # # # ###### ##### # # # # # # #
|
||
* # # # # # # # # # # # # ## #
|
||
* #### # # # # # # # ###### # # # ######
|
||
*/
|
||
|
||
|
||
void
|
||
_DtTermActionInsertLine(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
_DtTermFuncInsertLine(w,1,1) ;
|
||
(void) _DtTermPrimCursorOn(w);
|
||
}
|
||
|
||
|
||
|
||
/*** CURSOR MOTION ************************************************************
|
||
*
|
||
* #### # # ##### #### #### #####
|
||
* # # # # # # # # # # #
|
||
* # # # # # #### # # # #
|
||
* # # # ##### # # # #####
|
||
* # # # # # # # # # # # #
|
||
* #### #### # # #### #### # #
|
||
*
|
||
*
|
||
* # # #### ##### # #### # #
|
||
* ## ## # # # # # # ## #
|
||
* # ## # # # # # # # # # #
|
||
* # # # # # # # # # # #
|
||
* # # # # # # # # # ##
|
||
* # # #### # # #### # #
|
||
*/
|
||
|
||
typedef enum {
|
||
cursorForward,
|
||
cursorBackward,
|
||
cursorUp,
|
||
cursorDown
|
||
} CursorDirection;
|
||
|
||
static EnumType cursorDirections[] = {
|
||
{ "forward", (char) cursorForward, },
|
||
{ "backward", (char) cursorBackward, },
|
||
{ "up", (char) cursorUp, },
|
||
{ "down", (char) cursorDown },
|
||
};
|
||
|
||
void
|
||
_DtTermActionMoveCursor(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
int i;
|
||
|
||
if (*num_params < 1) {
|
||
return;
|
||
}
|
||
|
||
/* figure out the direction... */
|
||
i = stringToEnum(params[0], cursorDirections, XtNumber(cursorDirections));
|
||
if (i < 0) {
|
||
/* no match... */
|
||
return;
|
||
}
|
||
|
||
switch((CursorDirection) cursorDirections[i].value) {
|
||
case cursorUp:
|
||
if (((DtTermWidget)w)->vt.td->applicationMode)
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_UP_APP);
|
||
else
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_UP);
|
||
break;
|
||
|
||
case cursorDown:
|
||
if (((DtTermWidget)w)->vt.td->applicationMode)
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_DOWN_APP);
|
||
else
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_DOWN);
|
||
break;
|
||
|
||
case cursorForward:
|
||
if (((DtTermWidget)w)->vt.td->applicationMode)
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_RIGHT_APP);
|
||
else
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_RIGHT);
|
||
break;
|
||
|
||
case cursorBackward:
|
||
if (((DtTermWidget)w)->vt.td->applicationMode)
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_LEFT_APP);
|
||
else
|
||
(void) _DtTermWriteEscSeq(w, ESC_CURSOR_LEFT);
|
||
break;
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
void
|
||
_DtTermActionTab(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
(void) _DtTermPrimSendInput(w, (unsigned char *) "\t", 1);
|
||
return;
|
||
}
|
||
|
||
|
||
/*** FUNCTION KEYS ************************************************************
|
||
*
|
||
* ###### # # # # #### ##### # #### # #
|
||
* # # # ## # # # # # # # ## #
|
||
* ##### # # # # # # # # # # # # #
|
||
* # # # # # # # # # # # # # #
|
||
* # # # # ## # # # # # # # ##
|
||
* # #### # # #### # # #### # #
|
||
*
|
||
*
|
||
* # # ###### # # ####
|
||
* # # # # # #
|
||
* #### ##### # ####
|
||
* # # # # #
|
||
* # # # # # #
|
||
* # # ###### # ####
|
||
*/
|
||
void
|
||
_DtTermActionFunctionKeyExecute(Widget w, XEvent *event, String *params,
|
||
Cardinal *num_params)
|
||
{
|
||
Boolean shift = False;
|
||
long keyNumber;
|
||
char *ret;
|
||
int i;
|
||
|
||
/* must have a key number, may have a shift/unshift as well... */
|
||
if (*num_params < 1) {
|
||
return;
|
||
}
|
||
|
||
/* get a key number... */
|
||
keyNumber = strtol(params[0], &ret, 0);
|
||
|
||
|
||
/* if we had anything left in the string, the number is bogus... */
|
||
if (*ret) {
|
||
return;
|
||
}
|
||
|
||
if (*num_params >= 2) {
|
||
if (!strcmp(params[1], "UDK")) {
|
||
shift = True;
|
||
} else if (!strcmp(params[1], "function")) {
|
||
shift = False;
|
||
} else {
|
||
return;
|
||
}
|
||
}
|
||
|
||
/* execute the key... */
|
||
(void) _DtTermFunctionKeyExecute(w, (short) keyNumber, shift);
|
||
return;
|
||
}
|
||
|
||
|
||
/**************************************************************************
|
||
*
|
||
* KEYPAD
|
||
*
|
||
*/
|
||
|
||
static char *kpTypes[] = { "space", "tab", "enter", "f1", "f2", "f3", "f4",
|
||
"equal", "multiply", "add", "separator", "subtract", "decimal", "divide",
|
||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
|
||
};
|
||
static int no_kptypes=sizeof(kpTypes)/sizeof(char *) ;
|
||
|
||
void
|
||
_DtTermActionKeypadKeyExecute(Widget w, XEvent *event, String *params,
|
||
Cardinal *num_params)
|
||
{
|
||
DtTermWidget tw = (DtTermWidget)w;
|
||
Boolean shift = False;
|
||
long keyNumber;
|
||
char *ret;
|
||
int type;
|
||
DtTermData td = tw->vt.td;
|
||
|
||
if (KEYBOARD_LOCKED(td->tpd->keyboardLocked)) {
|
||
/* keyboard locked -- ring the bell...
|
||
*/
|
||
(void) _DtTermPrimBell(w);
|
||
return ;
|
||
}
|
||
/* must have an edit key type... */
|
||
if (*num_params < 1) {
|
||
return;
|
||
}
|
||
#ifdef _AIX
|
||
/*
|
||
* IBM JP kbd specific code. IBM JP kbd requires IM functionality
|
||
* to recoginze NumLock state + (*,/) key
|
||
*
|
||
* The following code is derived from TermPrim/TermPrim.c's
|
||
* _DtTermPrimActionKeyInput()
|
||
*
|
||
*/
|
||
{
|
||
XKeyEvent *keyEvent = (XKeyEvent *)event;
|
||
KeySym keysym;
|
||
Status status;
|
||
unsigned char string[BUFSIZ];
|
||
int nbytes;
|
||
|
||
nbytes = XmImMbLookupString(w, keyEvent, (char *) string,
|
||
sizeof(string), &keysym, &status);
|
||
|
||
/*
|
||
* Usually we have to take care of the status. Yet, this function is
|
||
* called only when KP_XX is pressed. So in this case, ignore any
|
||
* error case..... Please keep your fingers crossed !
|
||
*/
|
||
|
||
/*
|
||
* Hack code........
|
||
*/
|
||
if ( ( keysym == XK_KP_Add ) || ( keysym == XK_KP_Multiply ) ) {
|
||
if ( string[0] == '*' )
|
||
params[0] = "multiply";
|
||
else if ( string[0] == '+' )
|
||
params[0] = "add";
|
||
}
|
||
}
|
||
#endif /* _AIX */
|
||
|
||
type=0;
|
||
while( strcmp(params[0],kpTypes[type]) && type<= no_kptypes ) type++;
|
||
|
||
if (type > no_kptypes) return ;
|
||
|
||
if ( tw->vt.td->applicationKPMode ) {
|
||
_DtTermWriteEscSeq(w,AppKeypadKey[type]);
|
||
}
|
||
else {
|
||
_DtTermPrimSendInput(w,(unsigned char *)KeypadKey[type],
|
||
strlen(KeypadKey[type]));
|
||
if ( type == 2 && tw->term.tpd->autoLineFeed )
|
||
_DtTermPrimSendInput(w,(unsigned char *)"\012",1);/* newline */
|
||
}
|
||
}
|
||
|
||
/***********************************************************************
|
||
*
|
||
* Edit Keys (Find, Insert Here, Remove, Select, Prev Screen, Next Screen)
|
||
*
|
||
*/
|
||
|
||
typedef enum {
|
||
findType,
|
||
insertType,
|
||
selectType,
|
||
priorType,
|
||
nextType,
|
||
deleteType,
|
||
removeType,
|
||
helpType,
|
||
menuType,
|
||
doType
|
||
} EditType;
|
||
|
||
static EnumType editTypes[] = {
|
||
{ "find", (char) findType, },
|
||
{ "insert", (char) insertType, },
|
||
{ "select", (char) selectType, },
|
||
{ "next", (char) nextType, },
|
||
{ "prior", (char) priorType, },
|
||
{ "delete", (char) deleteType, },
|
||
{ "remove", (char) removeType, },
|
||
{ "help", (char) helpType, },
|
||
{ "menu", (char) menuType, },
|
||
{ "do", (char) doType },
|
||
};
|
||
|
||
void
|
||
_DtTermActionEditKeyExecute(Widget w, XEvent *event, String *params,
|
||
Cardinal *num_params)
|
||
{
|
||
DtTermWidget tw = (DtTermWidget)w;
|
||
Boolean shift = False;
|
||
long keyNumber;
|
||
char *ret;
|
||
int i;
|
||
DtTermData td = tw->vt.td;
|
||
|
||
if (*num_params < 1) {
|
||
return;
|
||
}
|
||
|
||
/* figure out the direction... */
|
||
i = stringToEnum(params[0], editTypes, XtNumber(editTypes));
|
||
if (i < 0) {
|
||
/* no match... */
|
||
return;
|
||
}
|
||
|
||
switch( editTypes[i].value) {
|
||
case findType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_FIND) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_FIND_SUN);
|
||
}
|
||
break;
|
||
case insertType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_INSERT_HERE) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_INSERT_HERE_SUN);
|
||
}
|
||
break;
|
||
case selectType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_SELECT) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_SELECT_SUN);
|
||
}
|
||
break;
|
||
case priorType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_PREV_SCREEN) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_PREV_SCREEN_SUN);
|
||
}
|
||
break;
|
||
case nextType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_NEXT_SCREEN) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_NEXT_SCREEN_SUN);
|
||
}
|
||
break;
|
||
case deleteType:
|
||
case removeType:
|
||
if ( tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_DELETE) ;
|
||
}
|
||
else {
|
||
(void) _DtTermWriteEscSeq(w,ESC_DELETE_SUN);
|
||
}
|
||
break;
|
||
|
||
case helpType:
|
||
if (tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_HELP);
|
||
} else {
|
||
(void) _DtTermWriteEscSeq(w, ESC_HELP_SUN);
|
||
}
|
||
break;
|
||
|
||
case menuType:
|
||
if (tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_MENU);
|
||
} else {
|
||
(void) _DtTermWriteEscSeq(w, ESC_MENU_SUN);
|
||
}
|
||
break;
|
||
|
||
case doType:
|
||
if (tw->vt.sunFunctionKeys == False) {
|
||
(void) _DtTermWriteEscSeq(w, ESC_DO);
|
||
} else {
|
||
(void) _DtTermWriteEscSeq(w, ESC_DO_SUN);
|
||
}
|
||
break;
|
||
|
||
}
|
||
}
|