diff options
Diffstat (limited to 'vendor/x11iraf/xgterm/input.c')
-rw-r--r-- | vendor/x11iraf/xgterm/input.c | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/vendor/x11iraf/xgterm/input.c b/vendor/x11iraf/xgterm/input.c new file mode 100644 index 00000000..ef806738 --- /dev/null +++ b/vendor/x11iraf/xgterm/input.c @@ -0,0 +1,295 @@ +/* + * $XConsortium: input.c,v 1.18 94/05/14 15:53:34 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> + +/* The following are from X11R6 and allow some R6 code to be used below. */ +#ifndef XK_KP_Home +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#endif + +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; +{ + +#ifdef I18N +#define STRBUFSIZE 500 +#else +#define STRBUFSIZE 100 +#endif + + char strbuf[STRBUFSIZE]; + register char *string; + register int key = FALSE; + int pty = screen->respond; + int nbytes; + KeySym keysym = 0; + ANSI reply; +#ifdef I18N + Status status_return; +#endif + +#ifdef I18N + if (screen->xic) + nbytes = XmbLookupString (screen->xic, event, strbuf, STRBUFSIZE, + &keysym, &status_return); + else + nbytes = XLookupString (event, strbuf, STRBUFSIZE, + &keysym, &compose_status); +#else + nbytes = XLookupString (event, strbuf, STRBUFSIZE, + &keysym, &compose_status); +#endif + + string = &strbuf[0]; + reply.a_pintro = 0; + reply.a_final = 0; + reply.a_nparam = 0; + reply.a_inters = 0; + + if (keysym >= XK_KP_Home && keysym <= XK_KP_Begin) { + keysym += XK_Home - XK_KP_Home; + } + + if (IsPFKey(keysym)) { + reply.a_type = SS3; + unparseseq(&reply, pty); + unparseputc((char)(keysym-XK_KP_F1+'P'), 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 || keysym == XK_KP_Delete || + keysym == XK_KP_Insert) { + 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 (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 (nbytes > 0) { + 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) + AdjustAfterInput(screen); + return; +} + +StringInput (screen, string, nbytes) + register TScreen *screen; + register char *string; + int nbytes; +{ + int pty = screen->respond; + + while (nbytes-- > 0) + unparseputc(*string++, pty); + 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_KP_Insert: return(2); + case XK_Delete: return(3); + case XK_KP_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_KP_Insert: return(2); + case XK_Delete: return(3); + case XK_KP_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); + } +} |