keytrans.cpp
上传用户:tigerk9
上传日期:2020-03-10
资源大小:237k
文件大小:7k
- ///////////////////////////////////////////////////////////////////////////////
- //Telnet Win32 : an ANSI telnet client.
- //Copyright (C) 1998-2000 Paul Brannan
- //Copyright (C) 1998 I.Ioannou
- //Copyright (C) 1997 Brad Johnson
- //
- //This program is free software; you can redistribute it and/or
- //modify it under the terms of the GNU General Public License
- //as published by the Free Software Foundation; either version 2
- //of the License, or (at your option) any later version.
- //
- //This program is distributed in the hope that it will be useful,
- //but WITHOUT ANY WARRANTY; without even the implied warranty of
- //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- //GNU General Public License for more details.
- //
- //You should have received a copy of the GNU General Public License
- //along with this program; if not, write to the Free Software
- //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- //
- //I.Ioannou
- //roryt@hol.gr
- //
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////
- // Key translations - I.Ioannou (roryt@hol.gr) //
- // Athens - Greece December 18, 1996 02:56am //
- // Reads a .cfg file and keeps the definitions //
- // modified for alternate keymap swiching //
- // by Andrey V. Smilianets (smile@head.aval.kiev.ua) //
- // Kiev - Ukraine, December 1997. //
- // modified to work with MSVC and the Standard Template //
- // library by Paul Brannan <pbranna@clemson.edu>, //
- // May 25, 1998 //
- // updated June 7, 1998 by Paul Brannan to remove cout and //
- // cerr statements //
- // APP_KEY and APP2_Key added July 12, 1998 by Paul Brannan //
- ///////////////////////////////////////////////////////////////////
- // class KeyTranslator //
- // Load : loads or replaces the keymap //
- // TranslateKey : returns a char * to the key def //
- // AddKeyDef : Changes or adds the key translation //
- // DeleteKeyDef : Deletes a key def from the list //
- ///////////////////////////////////////////////////////////////////
- #include <windows.h>
- // changed to make work with VC++ (Paul Brannan 5/25/98)
- // FIX ME !!! Ioannou: This must be __BORLANDC__ && VERSION < 5
- // but what is the directive for Borland version ????
- // FIXED Sept. 31, 2000 (Bernard Badger)
- //
- #if defined(__BORLANDC__) && (__BORLANDC < 0x0500)
- #include <mem.h>
- #else
- #include <memory.h>
- #endif
- #include "keytrans.h"
- #include "tnerror.h"
- /////////////////////////////////////////////////////////////
- // class KeyTranslator //
- // Load : loads or replaces the keymap //
- // TranslateKey : returns a sz to the key def //
- // AddKeyDef : Changes or adds the key translation //
- // DeleteKeyDef : Deletes a key def from the list //
- /////////////////////////////////////////////////////////////
- KeyTranslator::KeyTranslator():
- mapArray(0,0,sizeof(KeyMap)),
- globals(0,0,sizeof(TKeyDef)) {
- ext_mode = 0; // Paul Brannan 8/28/98
- currentKeyMap = mainKeyMap = -1;
- };
- //AVS
- // perform keymap switching
- int KeyTranslator::switchMap(TKeyDef& tk) {
- if ( mapArray.IsEmpty() ) {
- return currentKeyMap = -1;
- };
- int i = mapArray.Find(KeyMap(tk));
- if ( i != INT_MAX ) {
- if (currentKeyMap == i)
- currentKeyMap = mainKeyMap; // restore to default
- else currentKeyMap = i;
- return 1;
- };
- return 0;
- };
- // Let the calling function interpret the error code (Paul Brannan 12/17/98)
- int KeyTranslator::SwitchTo(int to) {
-
- int max = mapArray.GetItemsInContainer();
- if (max == 0) return -1;
- if (to < 0 || to > (max-1)) return 0;
-
- currentKeyMap = to;
- return 1;
- };
- //AVS
- // rewrited to support multiple keymaps
- const char *KeyTranslator::TranslateKey(WORD wVirtualKeyCode,
- DWORD dwControlKeyState)
- {
- if ( mapArray.IsEmpty() ) return NULL;
-
- TKeyDef ask(NULL, dwControlKeyState, wVirtualKeyCode);
-
- // if a keymap switch pressed
- if ( switchMap(ask) > 0 ) return "";
-
- int i = mapArray[currentKeyMap].map.Find(ask);
-
- if ( i != INT_MAX) return mapArray[currentKeyMap].map[i].GetszKey();
-
- // if not found in current keymap
- if ( currentKeyMap != mainKeyMap ) {
- i = mapArray[mainKeyMap].map.Find(ask);
- if ( i != INT_MAX) return mapArray[mainKeyMap].map[i].GetszKey();
- };
- return NULL;
- };
- //AVS
- // rewrited to support multiple keymaps
- int KeyTranslator::AddKeyDef(WORD wVirtualKeyCode, DWORD dwControlKeyState,
- char*lpzKeyDef)
- {
- if ( ! mapArray[currentKeyMap].map.IsEmpty() ) {
- int i = mapArray[currentKeyMap].map.Find(TKeyDef(NULL, dwControlKeyState, wVirtualKeyCode));
- if ( i != INT_MAX) {
- mapArray[currentKeyMap].map[i] = lpzKeyDef;
- return 1;
- }
- };
- return mapArray[currentKeyMap].map.Add( TKeyDef(lpzKeyDef, dwControlKeyState, wVirtualKeyCode));
- }
- // Paul Brannan Feb. 22, 1999
- int KeyTranslator::AddKeyDef(WORD wVirtualKeyCode, DWORD dwControlKeyState,
- tn_ops the_op)
- {
- optype op;
- op.sendstr = 0;
- op.the_op = the_op;
- if ( ! mapArray[currentKeyMap].map.IsEmpty() ) {
- int i = mapArray[currentKeyMap].map.Find(TKeyDef(NULL, dwControlKeyState, wVirtualKeyCode));
- if ( i != INT_MAX) {
- mapArray[currentKeyMap].map[i] = op;
- return 1;
- }
- };
- return mapArray[currentKeyMap].map.Add( TKeyDef(op, dwControlKeyState, wVirtualKeyCode));
- }
- // AVS
- int KeyTranslator::LookOnGlobal(char* vkey) {
- if ( ! globals.IsEmpty() ) {
- int max = globals.GetItemsInContainer();
- for ( int i = 0; i < max ; i++ )
- if ( stricmp(globals[i].GetszKey(), vkey) == 0 )
- return i;
- };
- return INT_MAX;
- };
- int KeyTranslator::AddGlobalDef(WORD wVirtualKeyCode, char*lpzKeyDef) {
- if ( ! globals.IsEmpty() ) {
- int max = globals.GetItemsInContainer();
- for ( int i = 0; i < max ; i++ ) {
- const char *s = globals[i].GetszKey();
- if ( stricmp(s, lpzKeyDef) == 0 ) {
- globals[i] = DWORD(wVirtualKeyCode);
- return 1;
- }
- }
- }
- return globals.Add( TKeyDef(lpzKeyDef, 0, wVirtualKeyCode));
- }
- //AVS
- // rewrited to support multiple keymaps
- int KeyTranslator::DeleteKeyDef(WORD wVirtualKeyCode, DWORD dwControlKeyState)
- {
- if ( mapArray.IsEmpty() || mapArray[currentKeyMap].map.IsEmpty() )
- return 0;
-
- int i = mapArray[currentKeyMap].map.Find(TKeyDef(NULL, dwControlKeyState, wVirtualKeyCode));
-
- if ( i != INT_MAX) {
- mapArray[currentKeyMap].map.Destroy(i);
- return 1;
- };
- return 0;
- };
- //AVS
- // rewritten to support multiple keymaps
- void KeyTranslator::DeleteAllDefs(void)
- {
- // This code wants to crash under the STL; Apparently the Destroy()
- // function actually deletes the entry, rather than simply releasing
- // memory. I think flush() should do the same thing, at least the
- // way it is written with STL_BIDS (Paul Brannan 5/25/98).
- int max;
-
- max = mapArray.GetItemsInContainer();
- if ( ! mapArray.IsEmpty() ) {
- for ( int i = 0; i < max; i++ ) {
- if ( !mapArray[i].map.IsEmpty() ) {
- mapArray[i].map.Flush();
- };
- };
- };
- globals.Flush();
- mapArray.Flush();
- currentKeyMap = -1;
- mainKeyMap = -1;
- };