⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 terminalkeys.cpp

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 CPP
字号:
/*    terminalkeys.cpp * * Sends a key to the output, taking terminal emulation settings into account. * This really should be a part of the terminal emulation code, and not in the * frontend! * * The keyboard translation code also should use some kind of Putty-internal * key codes, instead of system-specific codes, which would make it portable. * Now each port has to handle keyboard completely separately. * * Based on TranslateKey() in window.c. * * Copyright 2002 Petteri Kangaslampi * * PuTTY is copyright 1997-2001 Simon Tatham. * * Portions copyright Robert de Bath, Joris van Rantwijk, Delian * Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, * and CORE SDI S.A. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/#include <e32std.h>#include <e32cons.h>extern "C" {    #include "putty.h"}#include <assert.h>#include "sshtestconsole.h"int TranslateKey(TKeyCode aKey, TUint aModifiers, char *output);// Translates a key and sends itvoid SendKey(TKeyCode aCode, TUint aModifiers) {    char buf[16];    // Reset scrollback    seen_key_event = 1;    // Interrupt paste    term_nopaste();    // Try to translate as a control character    int xbytes = TranslateKey(aCode, aModifiers, buf);    assert(xbytes < 16);    if ( xbytes > 0 ) {        // Send control key codes as is        ldisc_send(buf, xbytes, 1);            } else if ( xbytes == -1 ) {        // Not translated, probably a normal letter        if ( aCode < ENonCharacterKeyBase ) {            wchar_t wc = (wchar_t) aCode;            luni_send(&wc, 1, 1);        }    }}// Translates control character keypress. Returns the number of bytes of output// written. Returns -1 if nothing was translated.int TranslateKey(TKeyCode aKey, TUint aModifiers, char *output) {        char *p = output;    TUint shiftMod = aModifiers &        (EModifierFunc | EModifierCtrl | EModifierShift);    // First some basic control characters    if ( (aKey == EKeyBackspace) && (shiftMod == 0) ) {        // Backspace        *p++ = (char) (cfg.bksp_is_delete ? 0x7F : 0x08);        return 1;    }    if ( (aKey == EKeyTab) && (shiftMod == EModifierShift) ) {        // Shift-Tab        *p++ = 0x1B;        *p++ = '[';        *p++ = 'Z';        return p - output;    }    if ( (aKey == EKeySpace) && (shiftMod == EModifierCtrl) ) {        // Ctrl-Space        *p++ = 0;        return p - output;    }    if ( (aKey == EKeySpace) && (shiftMod == (EModifierCtrl | EModifierShift)) ) {        // Ctrl-Shift-Space        *p++ = 0;        return p - output;    }    if ( (shiftMod == EModifierCtrl) && (aKey >= '2') && (aKey <= '8') ) {        // Ctrl-2 through Ctrl-8        *p++ = "\000\033\034\035\036\037\177"[aKey - '2'];        return p - output;    }    if ( (aKey == EKeyEnter) && cr_lf_return ) {        // Enter (if it should send CR + LF)        *p++ = '\r';        *p++ = '\n';        return p - output;    }    // Page up / page down (use chr+up/down)    int code = 0;    if ( (aKey == EKeyPageUp) ||         ((shiftMod & EModifierFunc) && (aKey == EKeyUpArrow)) ) {        code = 5;    }    if ( (aKey == EKeyPageDown) ||         ((shiftMod & EModifierFunc) && (aKey == EKeyDownArrow)) ) {        code = 6;    }    if ( code > 0 ) {	/* Reorder edit keys to physical order */	if (cfg.funky_type == 3 && code <= 6)	    code = "\0\2\1\4\5\3\6"[code];        	if (vt52_mode && code > 0 && code <= 6) {	    p += sprintf((char *) p, "\x1B%c", " HLMEIG"[code]);	    return p - output;	}        	if (cfg.funky_type == 5 &&     /* SCO small keypad */	    code >= 1 && code <= 6) {	    char codes[] = "HL.FIG";	    if (code == 3) {		*p++ = '\x7F';	    } else {		p += sprintf((char *) p, "\x1B[%c", codes[code-1]);	    }	    return p - output;	}                p += sprintf((char *) p, "\x1B[%d~", code);        return p - output;    }    // Arrows    char xkey = 0;    switch ( aKey ) {        case EKeyUpArrow:            xkey = 'A';            break;        case EKeyDownArrow:            xkey = 'B';            break;        case EKeyRightArrow:            xkey = 'C';            break;        case EKeyLeftArrow:            xkey = 'D';            break;    }    if ( xkey ) {        if (vt52_mode)            p += sprintf((char *) p, "\x1B%c", xkey);        else {            int app_flg = (app_cursor_keys && !cfg.no_applic_c);                        /* Useful mapping of Ctrl-arrows */            if ( shiftMod == EModifierCtrl )                app_flg = !app_flg;            if (app_flg)                p += sprintf((char *) p, "\x1BO%c", xkey);            else                p += sprintf((char *) p, "\x1B[%c", xkey);        }        return p - output;    }    // OK, handle it as a normal unicode key    return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -