266 lines
7.8 KiB
C
266 lines
7.8 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 "TermHeader.h"
|
||
#include "TermPrimDebug.h"
|
||
#include "TermPrimP.h"
|
||
#include "TermPrimI.h"
|
||
#include "TermPrimData.h"
|
||
#include "TermPrimAction.h"
|
||
#include "TermPrimFunction.h"
|
||
|
||
static void
|
||
invokeAction(Widget w, char *transmitString, TermFunction function, int count)
|
||
{
|
||
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
||
struct termData *tpd = tw->term.tpd;
|
||
|
||
if (KEYBOARD_LOCKED(tpd->keyboardLocked)) {
|
||
/* keyboard locked -- ring the bell...
|
||
*/
|
||
(void) _DtTermPrimBell(w);
|
||
} else if (tpd->transmitFunctions && transmitString) {
|
||
/* transmit functions mode -- transmit them...
|
||
*/
|
||
(void) _DtTermPrimSendInput(w, (unsigned char *) transmitString,
|
||
strlen(transmitString));
|
||
} else {
|
||
/* perform the function...
|
||
*/
|
||
(*function)(w, count, fromAction);
|
||
|
||
#ifdef NOTDEF
|
||
/* we need to wait for the scroll to complete before turning
|
||
* on the cursor...
|
||
*/
|
||
(void) _DtTermPrimScrollComplete(w, True);
|
||
#endif /* NOTDEF */
|
||
(void) _DtTermPrimCursorOn(w);
|
||
}
|
||
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);
|
||
}
|
||
|
||
|
||
/*** INSERT CHAR/LINE *********************************************************
|
||
*
|
||
* # # # #### ###### ##### #####
|
||
* # ## # # # # # #
|
||
* # # # # #### ##### # # #
|
||
* # # # # # # ##### #
|
||
* # # ## # # # # # #
|
||
* # # # #### ###### # # #
|
||
*
|
||
* #
|
||
* #### # # ## ##### # # # # # ######
|
||
* # # # # # # # # # # # ## # #
|
||
* # ###### # # # # # # # # # # #####
|
||
* # # # ###### ##### # # # # # # #
|
||
* # # # # # # # # # # # # ## #
|
||
* #### # # # # # # # ###### # # # ######
|
||
*/
|
||
|
||
void
|
||
_DtTermPrimActionInsert(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
Debug('i', fprintf(stderr,
|
||
">>_DtTermPrimActionInsert: not yet implemented\n"));
|
||
}
|
||
|
||
|
||
|
||
/*** CURSOR MOTION ************************************************************
|
||
*
|
||
* #### # # ##### #### #### #####
|
||
* # # # # # # # # # # #
|
||
* # # # # # #### # # # #
|
||
* # # # ##### # # # #####
|
||
* # # # # # # # # # # # #
|
||
* #### #### # # #### #### # #
|
||
*
|
||
*
|
||
* # # #### ##### # #### # #
|
||
* ## ## # # # # # # ## #
|
||
* # ## # # # # # # # # # #
|
||
* # # # # # # # # # # #
|
||
* # # # # # # # # # ##
|
||
* # # #### # # #### # #
|
||
*/
|
||
|
||
void
|
||
_DtTermPrimActionRedrawDisplay(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
(void) invokeAction(w, NULL, _DtTermPrimFuncRedrawDisplay, 1);
|
||
return;
|
||
}
|
||
|
||
|
||
void
|
||
_DtTermPrimActionReturn(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
Debug('i', fprintf(stderr,
|
||
">>_DtTermPrimActionReturn: not yet implemented\n"));
|
||
return;
|
||
}
|
||
|
||
void
|
||
_DtTermPrimActionTab(Widget w, XEvent *event,
|
||
String *params, Cardinal *num_params)
|
||
{
|
||
DtTermPrimitiveWidget tw = (DtTermPrimitiveWidget) w;
|
||
Boolean shiftedTab = False;
|
||
Boolean numericTab = False;
|
||
int i;
|
||
|
||
(void) _DtTermPrimSendInput(w, (unsigned char *) "\t", 1);
|
||
return;
|
||
}
|
||
|
||
|
||
/*** STRING *******************************************************************
|
||
*
|
||
* #### ##### ##### # # # ####
|
||
* # # # # # ## # # #
|
||
* #### # # # # # # # #
|
||
* # # ##### # # # # # ###
|
||
* # # # # # # # ## # #
|
||
* #### # # # # # # ####
|
||
*/
|
||
|
||
void
|
||
_DtTermPrimActionString(Widget w, XEvent *event, String *params, Cardinal *num_params)
|
||
{
|
||
unsigned char *c;
|
||
unsigned char hexVal;
|
||
|
||
/* this is based on the functionality offered by xterm...
|
||
*/
|
||
|
||
if (*num_params != 1)
|
||
return;
|
||
|
||
/* process hex values... */
|
||
if (((*params)[0] == '0') &&
|
||
(((*params)[1] == 'x') || ((*params)[1] == 'X')) &&
|
||
((*params)[2] != '\0')) {
|
||
for (hexVal = 0, c = (unsigned char *) (*params + 2); *c; c++) {
|
||
hexVal *= 16;
|
||
*c = tolower(*c);
|
||
if ((*c >= '0') && (*c <= '9')) {
|
||
hexVal += *c - '0';
|
||
} else if ((*c >= 'a') && (*c <= 'f')) {
|
||
hexVal += *c - 'a' + 10;
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
/* if we hit the end of the string, send the hex value... */
|
||
if (*c == '\0') {
|
||
(void) _DtTermPrimSendInput(w, &hexVal, 1);
|
||
}
|
||
} else {
|
||
(void) _DtTermPrimSendInput(w, (unsigned char *) *params, strlen(*params));
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
/*** KEYMAP *******************************************************************
|
||
*
|
||
* # # ###### # # # # ## #####
|
||
* # # # # # ## ## # # # #
|
||
* #### ##### # # ## # # # # #
|
||
* # # # # # # ###### #####
|
||
* # # # # # # # # #
|
||
* # # ###### # # # # # #
|
||
*/
|
||
|
||
void
|
||
_DtTermPrimActionKeymap(Widget w, XEvent *event, String *params, Cardinal *num_params)
|
||
{
|
||
XtTranslations keymap;
|
||
char buffer[BUFSIZ];
|
||
static XtTranslations original = (XtTranslations) 0;
|
||
static XtResource key_resources[] = {
|
||
{XtNtranslations, XtCTranslations, XtRTranslationTable,
|
||
sizeof(XtTranslations), 0, XtRTranslationTable, (caddr_t) NULL}
|
||
};
|
||
char mapName[BUFSIZ];
|
||
char mapClass[BUFSIZ];
|
||
|
||
if (*num_params != 1) {
|
||
return;
|
||
}
|
||
|
||
_DtTermProcessLock();
|
||
if (original == (XtTranslations) 0) {
|
||
original = w->core.tm.translations;
|
||
}
|
||
_DtTermProcessUnlock();
|
||
|
||
if (!strcmp(params[0], "None")) {
|
||
(void) XtOverrideTranslations(w, original);
|
||
return;
|
||
}
|
||
|
||
(void) sprintf(mapName, "%sKeymap", params[0]);
|
||
(void) strcpy(mapClass, mapName);
|
||
mapClass[0] = toupper(mapClass[0]);
|
||
(void) XtGetSubresources(w, (XtPointer) &keymap, mapName, mapClass,
|
||
key_resources, XtNumber(key_resources), NULL, (Cardinal) 0);
|
||
|
||
if (keymap != NULL) {
|
||
(void) XtOverrideTranslations(w, keymap);
|
||
}
|
||
return;
|
||
}
|