home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.muug.mb.ca
/
2014.06.ftp.muug.mb.ca.tar
/
ftp.muug.mb.ca
/
pub
/
src
/
linux
/
old-src
/
xterm
/
input.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-11
|
8KB
|
292 lines
/*
* $XConsortium: input.c,v 1.16 91/05/10 16:57:16 gildea Exp $
*/
/*
* Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Digital Equipment
* Corporation not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/* input.c */
#include "ptyx.h" /* gets Xt headers, too */
#include <X11/keysym.h>
#include <X11/DECkeysym.h>
#include <X11/Xutil.h>
#include <stdio.h>
static XComposeStatus compose_status = {NULL, 0};
static char *kypd_num = " XXXXXXXX\tXXX\rXXXxxxxXXXXXXXXXXXXXXXXXXXXX*+,-./0123456789XXX=";
static char *kypd_apl = " ABCDEFGHIJKLMNOPQRSTUVWXYZ??????abcdefghijklmnopqrstuvwxyzXXX";
static char *cur = "DACB";
static int funcvalue(), sunfuncvalue();
extern Boolean sunFunctionKeys;
static void
AdjustAfterInput (screen)
register TScreen *screen;
{
if(screen->scrollkey && screen->topline != 0)
WindowScroll(screen, 0);
if(screen->marginbell) {
int col = screen->max_col - screen->nmarginbell;
if(screen->bellarmed >= 0) {
if(screen->bellarmed == screen->cur_row) {
if(screen->cur_col >= col) {
Bell();
screen->bellarmed = -1;
}
} else
screen->bellarmed =
screen->cur_col < col ? screen->cur_row : -1;
} else if(screen->cur_col < col)
screen->bellarmed = screen->cur_row;
}
}
Input (keyboard, screen, event, eightbit)
register TKeyboard *keyboard;
register TScreen *screen;
register XKeyEvent *event;
Bool eightbit;
{
#define STRBUFSIZE 100
char strbuf[STRBUFSIZE];
register char *string;
register int key = FALSE;
int pty = screen->respond;
int nbytes;
KeySym keysym;
ANSI reply;
char tmp[STRBUFSIZE];
char *bp = strbuf;
int count;
XEvent ev;
count = XLookupString (event, tmp, STRBUFSIZE,
&keysym, &compose_status);
strncpy(bp, tmp, count);
bp += count;
nbytes = count;
/*
* Make sure we get every keystroke available
* before we start doing the update, so can issue a single
* DrawString instead of several.
*/
while (nbytes < STRBUFSIZE &&
XCheckMaskEvent(screen->display, KeyPressMask, &ev)) {
count = XLookupString ((XKeyEvent *)&ev, tmp, STRBUFSIZE,
&keysym, &compose_status);
if (nbytes + count <= STRBUFSIZE) {
strncpy(bp, tmp, count);
bp += count;
nbytes += count;
} else {
XPutBackEvent(screen->display, &ev);
break;
}
}
string = &strbuf[0];
reply.a_pintro = 0;
reply.a_final = 0;
reply.a_nparam = 0;
reply.a_inters = 0;
if (IsPFKey(keysym)) {
reply.a_type = SS3;
unparseseq(&reply, pty);
unparseputc((char)(keysym-XK_KP_F1+'P'), pty);
key = TRUE;
} else if (IsKeypadKey(keysym)) {
if (keyboard->flags & KYPD_APL) {
reply.a_type = SS3;
unparseseq(&reply, pty);
unparseputc(kypd_apl[keysym-XK_KP_Space], pty);
} else
unparseputc(kypd_num[keysym-XK_KP_Space], pty);
key = TRUE;
} else if (IsCursorKey(keysym) &&
keysym != XK_Prior && keysym != XK_Next) {
if (keyboard->flags & CURSOR_APL) {
reply.a_type = SS3;
unparseseq(&reply, pty);
unparseputc(cur[keysym-XK_Left], pty);
} else {
reply.a_type = CSI;
reply.a_final = cur[keysym-XK_Left];
unparseseq(&reply, pty);
}
key = TRUE;
} else if (IsFunctionKey(keysym) || IsMiscFunctionKey(keysym) ||
keysym == XK_Prior || keysym == XK_Next ||
keysym == DXK_Remove) {
reply.a_type = CSI;
reply.a_nparam = 1;
if (sunFunctionKeys) {
reply.a_param[0] = sunfuncvalue (keysym);
reply.a_final = 'z';
} else {
reply.a_param[0] = funcvalue (keysym);
reply.a_final = '~';
}
if (reply.a_param[0] > 0)
unparseseq(&reply, pty);
key = TRUE;
} else if (nbytes > 0) {
if(screen->TekGIN) {
TekEnqMouse(*string++);
TekGINoff();
nbytes--;
}
if ((nbytes == 1) && eightbit) {
if (screen->input_eight_bits)
*string |= 0x80; /* turn on eighth bit */
else
unparseputc (033, pty); /* escape */
}
while (nbytes-- > 0)
unparseputc(*string++, pty);
key = TRUE;
}
if(key && !screen->TekEmu)
AdjustAfterInput(screen);
#ifdef ENABLE_PRINT
if (keysym == XK_F2) TekPrint();
#endif
return;
}
StringInput (screen, string, nbytes)
register TScreen *screen;
register char *string;
int nbytes;
{
int pty = screen->respond;
if(nbytes && screen->TekGIN) {
TekEnqMouse(*string++);
TekGINoff();
nbytes--;
}
while (nbytes-- > 0)
unparseputc(*string++, pty);
if(!screen->TekEmu)
AdjustAfterInput(screen);
}
static int funcvalue (keycode)
int keycode;
{
switch (keycode) {
case XK_F1: return(11);
case XK_F2: return(12);
case XK_F3: return(13);
case XK_F4: return(14);
case XK_F5: return(15);
case XK_F6: return(17);
case XK_F7: return(18);
case XK_F8: return(19);
case XK_F9: return(20);
case XK_F10: return(21);
case XK_F11: return(23);
case XK_F12: return(24);
case XK_F13: return(25);
case XK_F14: return(26);
case XK_F15: return(28);
case XK_Help: return(28);
case XK_F16: return(29);
case XK_Menu: return(29);
case XK_F17: return(31);
case XK_F18: return(32);
case XK_F19: return(33);
case XK_F20: return(34);
case XK_Find : return(1);
case XK_Insert: return(2);
case XK_Delete: return(3);
case DXK_Remove: return(3);
case XK_Select: return(4);
case XK_Prior: return(5);
case XK_Next: return(6);
default: return(-1);
}
}
static int sunfuncvalue (keycode)
int keycode;
{
switch (keycode) {
case XK_F1: return(224);
case XK_F2: return(225);
case XK_F3: return(226);
case XK_F4: return(227);
case XK_F5: return(228);
case XK_F6: return(229);
case XK_F7: return(230);
case XK_F8: return(231);
case XK_F9: return(232);
case XK_F10: return(233);
case XK_F11: return(192);
case XK_F12: return(193);
case XK_F13: return(194);
case XK_F14: return(195);
case XK_F15: return(196);
case XK_Help: return(196);
case XK_F16: return(197);
case XK_Menu: return(197);
case XK_F17: return(198);
case XK_F18: return(199);
case XK_F19: return(200);
case XK_F20: return(201);
case XK_R1: return(208);
case XK_R2: return(209);
case XK_R3: return(210);
case XK_R4: return(211);
case XK_R5: return(212);
case XK_R6: return(213);
case XK_R7: return(214);
case XK_R8: return(215);
case XK_R9: return(216);
case XK_R10: return(217);
case XK_R11: return(218);
case XK_R12: return(219);
case XK_R13: return(220);
case XK_R14: return(221);
case XK_R15: return(222);
case XK_Find : return(1);
case XK_Insert: return(2);
case XK_Delete: return(3);
case DXK_Remove: return(3);
case XK_Select: return(4);
case XK_Prior: return(5);
case XK_Next: return(6);
default: return(-1);
}
}