📄 input.c
字号:
/* * $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 = " \0\0\0\0\0\0\0\0\t\0\0\0\r\0\0\0\0\0\0\0""7486293150.\0\0\0\0\0\0\0\0\0\0*+,-./0123456789\0\0\0=";static char *kypd_apl = " ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}";static char *kypd_cur = " ABCDEFGHIJKLMNOPQRSTwDACBysqu^_`abcdefghijklmnopqBsDuCwAyz{|}";/* curses workaround mapping: maps keypad arrows to cursor keys and * keypad home,end,etc to keypad numbers. -- JLM */static char *cur = "DACB";static int funcvalue(), sunfuncvalue();extern Boolean sunFunctionKeys;static voidAdjustAfterInput (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((screen->curses ? kypd_cur : kypd_apl)[keysym-XK_KP_Space], pty); /* If we're working around curses, use a different map. */ } else unparseputc(kypd_num[keysym-XK_KP_Space], pty); key = TRUE; } else if (IsCursorKey(keysym) && keysym != XK_Prior && keysym != XK_Next && keysym != XK_Home && keysym != XK_End) { 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 == XK_Home || keysym == XK_End || 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); case XK_Home: return(7); case XK_End: return(8); 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); case XK_Home: return(7); case XK_End: return(8); default: return(-1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -