From 40c2acbbf990588115e35b10f589954b7baa6eed Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sat, 2 Jul 2005 22:28:21 -0400 Subject: [PATCH] Changed: Console (ingame) now works ~g2k --- include/keys.h | 1 + src/keys.cpp | 174 +++++++++++++++++++++++++++++++++++++++++++++++++ src/linux.cpp | 54 ++++++++++++++- 3 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/keys.cpp diff --git a/include/keys.h b/include/keys.h index 64f4599..a2c68f9 100644 --- a/include/keys.h +++ b/include/keys.h @@ -113,5 +113,6 @@ namespace OpenArena const unsigned int KEY_LBUTTON = KEY_BUTTON0; const unsigned int KEY_RBUTTON = KEY_BUTTON1; const unsigned int KEY_MBUTTON = KEY_BUTTON2; + char KeyToASCII(Keys key, bool shift); }; #endif diff --git a/src/keys.cpp b/src/keys.cpp new file mode 100644 index 0000000..ad06c1a --- /dev/null +++ b/src/keys.cpp @@ -0,0 +1,174 @@ +#include "../include/keys.h" + +char OpenArena::KeyToASCII(Keys key, bool shift) +{ + if(key == KEY_UNKNOWN) + { + return '\0'; + } + else + { + switch(key) + { + case KEY_OEM_1: + if(shift) + { + return ':'; + } + else + { + return ';'; + } + break; + case KEY_OEM_2: + if(shift) + { + return '?'; + } + else + { + return '/'; + } + break; + case KEY_OEM_3: + if(shift) + { + return '~'; + } + else + { + return '`'; + } + break; + case KEY_OEM_4: + if(shift) + { + return '{'; + } + else + { + return '['; + } + break; + case KEY_OEM_5: + if(shift) + { + return '|'; + } + else + { + return '\\'; + } + break; + case KEY_OEM_6: + if(shift) + { + return '}'; + } + else + { + return ']'; + } + break; + case KEY_OEM_7: + if(shift) + { + return '\''; + } + else + { + return '"'; + } + break; + case KEY_OEM_PERIOD: + if(shift) + { + return '>'; + } + else + { + return '.'; + } + break; + case KEY_OEM_PLUS: + if(shift) + { + return '+'; + } + else + { + return '='; + } + break; + case KEY_OEM_COMMA: + if(shift) + { + return '<'; + } + else + { + return ','; + } + break; + case KEY_OEM_MINUS: + if(shift) + { + return '_'; + } + else + { + return '-'; + } + break; + default: + if(key >= KEY_A && key <= KEY_Z) + { + if(shift) + { + return key - KEY_A + 'A'; + } + else + { + return key - KEY_A + 'a'; + } + } + else if(key >= KEY_0 && key <= KEY_9) + { + if(shift) + { + switch(key - KEY_0) + { + case 0: + return ')'; + case 1: + return '!'; + case 2: + return '@'; + case 3: + return '#'; + case 4: + return '$'; + case 5: + return '%'; + case 6: + return '^'; + case 7: + return '&'; + case 8: + return '*'; + case 9: + return '('; + } + } + else + { + return key - KEY_0 + '0'; + } + } + else + { + return '\0'; + } + } + } +} diff --git a/src/linux.cpp b/src/linux.cpp index e07042a..ab94be2 100644 --- a/src/linux.cpp +++ b/src/linux.cpp @@ -37,6 +37,7 @@ using namespace std; void InitControls(); unsigned char TranslateKey(int keyCode); unsigned char TranslateButton(int keyCode); +void HandleConsoleKeyPress(OpenArena::Keys key); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function Definitions @@ -175,7 +176,14 @@ int main(int argc, char** argv) keys2[TranslateButton(event.xbutton.button)] = false; break; case KeyPress: - keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = true; + if(level.showConsole) + { + HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0))); + } + else + { + keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = true; + } break; case KeyRelease: keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; @@ -628,6 +636,7 @@ unsigned char TranslateKey(int keyCode) case XK_Pause: return OpenArena::KEY_PAUSE; case XK_KP_Space: + case XK_space: return OpenArena::KEY_SPACE; case XK_Insert: return OpenArena::KEY_INSERT; @@ -819,4 +828,47 @@ unsigned char TranslateButton(int keyCode) return OpenArena::KEY_BUTTON4; } } + +void HandleConsoleKeyPress(OpenArena::Keys key) +{ + //See if we need to hide the console + level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); + if(key == level.defaultPlayer[0].controls.toggleConsole.Retrieve()) + { + level.showConsole = false; + } + else + { + while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && level.showConsole) + { + if(level.defaultPlayer[0].controls.toggleConsole.Retrieve() == key) + { + level.showConsole = false; + } + } + } + switch (key) + { + case OpenArena::KEY_SHIFT: + keys[OpenArena::KEY_SHIFT] = true; + break; + case OpenArena::KEY_RETURN: + level.UpdateConsole('\n'); + break; + case OpenArena::KEY_SPACE: + printf("hello"); + level.UpdateConsole(' '); + break; + case OpenArena::KEY_BACK: + level.UpdateConsole(OpenArena::KEY_BACK); + break; + default: + char ascii = OpenArena::KeyToASCII(key, keys[OpenArena::KEY_SHIFT]); + if(ascii != '\0') + { + level.UpdateConsole(ascii); + } + } +} + #endif