mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
c98929fa7e
svn path=/trunk/; revision=2458
227 lines
7.2 KiB
C++
227 lines
7.2 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
//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;
|
|
};
|