1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/lib/DtTerm/Term/TermAction.c
Pascal Stumpf dc0e8ea74d Kill most warnings in lib/DtTerm.
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.
2013-07-22 17:12:07 -06:00

670 lines
19 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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;
}
}