From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: zhichao.gao@intel.com) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by groups.io with SMTP; Wed, 25 Sep 2019 05:14:11 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2019 05:14:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,547,1559545200"; d="scan'208";a="203598954" Received: from fieedk001.ccr.corp.intel.com ([10.239.33.119]) by fmsmga001.fm.intel.com with ESMTP; 25 Sep 2019 05:14:08 -0700 From: "Gao, Zhichao" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Ray Ni , Liming Gao Subject: [PATCH] MdeModulePkg/TerminalDxe: Enhance the arrow keys support Date: Wed, 25 Sep 2019 20:09:25 +0800 Message-Id: <20190925120925.12600-1-zhichao.gao@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2219 Refer to https://www.ssh.com/ssh/putty/putty-manuals/0.68/Chapter4.html#config-appcursor In normal mode, arrow key would send ESC [A through to ESC [D. In application mode, arrow key would send ESC OA through to ESC OD. Cc: Jian J Wang Cc: Hao A Wu Cc: Ray Ni Cc: Liming Gao Signed-off-by: Zhichao Gao --- .../Console/TerminalDxe/TerminalConIn.c | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c index ac31f27984..fdb1a0f1ef 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c @@ -1402,10 +1402,7 @@ UnicodeToEfiKey ( continue; } - if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == TerminalTypeVt100 || - TerminalDevice->TerminalType == TerminalTypeTtyTerm || - TerminalDevice->TerminalType == TerminalTypeXtermR6 || - TerminalDevice->TerminalType == TerminalTypeVt100Plus)) { + if (UnicodeChar == 'O') { TerminalDevice->InputState |= INPUT_STATE_O; TerminalDevice->ResetState = RESET_STATE_DEFAULT; continue; @@ -1631,6 +1628,35 @@ UnicodeToEfiKey ( } } + // + // In Putty application mode, the arrow keys would send + // ESC OA through to ESC OD + // + if (TerminalDevice->TerminalType == TerminalTypePcAnsi || + TerminalDevice->TerminalType == TerminalTypeVt100 || + TerminalDevice->TerminalType == TerminalTypeVt100Plus || + TerminalDevice->TerminalType == TerminalTypeVtUtf8 || + TerminalDevice->TerminalType == TerminalTypeTtyTerm || + TerminalDevice->TerminalType == TerminalTypeLinux || + TerminalDevice->TerminalType == TerminalTypeXtermR6 || + TerminalDevice->TerminalType == TerminalTypeVt400 || + TerminalDevice->TerminalType == TerminalTypeSCO) { + switch (UnicodeChar) { + case 'A': + Key.ScanCode = SCAN_UP; + break; + case 'B': + Key.ScanCode = SCAN_DOWN; + break; + case 'C': + Key.ScanCode = SCAN_RIGHT; + break; + case 'D': + Key.ScanCode = SCAN_LEFT; + break; + } + } + if (Key.ScanCode != SCAN_NULL) { Key.UnicodeChar = 0; EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); @@ -1668,10 +1694,18 @@ UnicodeToEfiKey ( Key.ScanCode = SCAN_NULL; + // + // In Putty normal mode, the arrow keys would send + // ESC [A through to [D + // if (TerminalDevice->TerminalType == TerminalTypePcAnsi || TerminalDevice->TerminalType == TerminalTypeVt100 || - TerminalDevice->TerminalType == TerminalTypeVtUtf8 || - TerminalDevice->TerminalType == TerminalTypeTtyTerm || + TerminalDevice->TerminalType == TerminalTypeVt100Plus || + TerminalDevice->TerminalType == TerminalTypeVtUtf8 || + TerminalDevice->TerminalType == TerminalTypeTtyTerm || + TerminalDevice->TerminalType == TerminalTypeLinux || + TerminalDevice->TerminalType == TerminalTypeXtermR6 || + TerminalDevice->TerminalType == TerminalTypeVt400 || TerminalDevice->TerminalType == TerminalTypeSCO) { switch (UnicodeChar) { case 'A': -- 2.21.0.windows.1