| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- /*
- ** 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 <http://www.gnu.org/licenses/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (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 //////////////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
|