/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** 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 3 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, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: HotKey.cpp ///////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Electronic Arts Pacific. // // Confidential Information // Copyright (C) 2002 - All Rights Reserved // //----------------------------------------------------------------------------- // // created: Sep 2002 // // Filename: HotKey.cpp // // author: Chris Huybregts // // purpose: // //----------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // SYSTEM INCLUDES //////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine //----------------------------------------------------------------------------- // USER INCLUDES ////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- #include "GameClient/HotKey.h" #include "GameClient/KeyDefs.h" #include "GameClient/MetaEvent.h" #include "GameClient/GameWindow.h" #include "GameClient/GameWindowManager.h" #include "GameClient/keyboard.h" #include "GameClient/GameText.h" #include "Common/AudioEventRTS.h" //----------------------------------------------------------------------------- // DEFINES //////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // PUBLIC FUNCTIONS /////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- GameMessageDisposition HotKeyTranslator::translateGameMessage(const GameMessage *msg) { GameMessageDisposition disp = KEEP_MESSAGE; GameMessage::Type t = msg->getType(); if ( t == GameMessage::MSG_RAW_KEY_UP) { //char key = msg->getArgument(0)->integer; Int keyState = msg->getArgument(1)->integer; // for our purposes here, we don't care to distinguish between right and left keys, // so just fudge a little to simplify things. Int newModState = 0; if( keyState & KEY_STATE_CONTROL ) { newModState |= CTRL; } if( keyState & KEY_STATE_SHIFT ) { newModState |= SHIFT; } if( keyState & KEY_STATE_ALT ) { newModState |= ALT; } if(newModState != 0) return disp; WideChar key = TheKeyboard->getPrintableKey(msg->getArgument(0)->integer, 0); UnicodeString uKey; uKey.set(&key); AsciiString aKey; aKey.translate(uKey); if(TheHotKeyManager && TheHotKeyManager->executeHotKey(aKey)) disp = DESTROY_MESSAGE; } return disp; } //----------------------------------------------------------------------------- HotKey::HotKey() { m_win = NULL; //Added By Sadullah Nader //Initializations missing and needed m_key.clear(); // } //----------------------------------------------------------------------------- HotKeyManager::HotKeyManager( void ) { } //----------------------------------------------------------------------------- HotKeyManager::~HotKeyManager( void ) { m_hotKeyMap.clear(); } //----------------------------------------------------------------------------- void HotKeyManager::init( void ) { m_hotKeyMap.clear(); } //----------------------------------------------------------------------------- void HotKeyManager::reset( void ) { m_hotKeyMap.clear(); } //----------------------------------------------------------------------------- void HotKeyManager::addHotKey( GameWindow *win, const AsciiString& keyIn) { AsciiString key = keyIn; key.toLower(); HotKeyMap::iterator it = m_hotKeyMap.find(key); if( it != m_hotKeyMap.end() ) { DEBUG_ASSERTCRASH(FALSE,("Hotkey %s is already mapped to window %s, current window is %s", key.str(), it->second.m_win->winGetInstanceData()->m_decoratedNameString.str(), win->winGetInstanceData()->m_decoratedNameString.str())); return; } HotKey newHK; newHK.m_key.set(key); newHK.m_win = win; m_hotKeyMap[key] = newHK; } //----------------------------------------------------------------------------- Bool HotKeyManager::executeHotKey( const AsciiString& keyIn ) { AsciiString key = keyIn; key.toLower(); HotKeyMap::iterator it = m_hotKeyMap.find(key); if( it == m_hotKeyMap.end() ) return FALSE; GameWindow *win = it->second.m_win; if( !win ) return FALSE; if( !BitTest( win->winGetStatus(), WIN_STATUS_HIDDEN ) ) { if( BitTest( win->winGetStatus(), WIN_STATUS_ENABLED ) ) { TheWindowManager->winSendSystemMsg( win->winGetParent(), GBM_SELECTED, (WindowMsgData)win, win->winGetWindowId() ); // here we make the same click sound that the GUI uses when you click a button AudioEventRTS buttonClick("GUIClick"); if( TheAudio ) { TheAudio->addAudioEvent( &buttonClick ); } // end if return TRUE; } AudioEventRTS disabledClick( "GUIClickDisabled" ); if( TheAudio ) { TheAudio->addAudioEvent( &disabledClick ); } } return FALSE; } //----------------------------------------------------------------------------- AsciiString HotKeyManager::searchHotKey( const AsciiString& label) { return searchHotKey(TheGameText->fetch(label)); } //----------------------------------------------------------------------------- AsciiString HotKeyManager::searchHotKey( const UnicodeString& uStr ) { if(uStr.isEmpty()) return AsciiString::TheEmptyString; const WideChar *marker = (const WideChar *)uStr.str(); while (marker && *marker) { if (*marker == L'&') { // found a '&' - now look for the next char UnicodeString tmp = UnicodeString::TheEmptyString; tmp.concat(*(marker+1)); AsciiString retStr; retStr.translate(tmp); return retStr; } marker++; } return AsciiString::TheEmptyString; } //----------------------------------------------------------------------------- HotKeyManager *TheHotKeyManager = NULL; //----------------------------------------------------------------------------- // PRIVATE FUNCTIONS ////////////////////////////////////////////////////////// //-----------------------------------------------------------------------------