diff --git a/source/graphics/GameView.cpp b/source/graphics/GameView.cpp index 5d84a97c29..0e077b4e0c 100755 --- a/source/graphics/GameView.cpp +++ b/source/graphics/GameView.cpp @@ -25,6 +25,7 @@ #include "Loader.h" #include "Profile.h" #include "ps/LoaderThunks.h" +#include "ps/Globals.h" #include "Quaternion.h" #include "Unit.h" @@ -40,7 +41,6 @@ float g_YMinOffset=25.0f; extern int g_xres, g_yres; -extern bool g_active; static CVector3D cameraBookmarks[10]; static bool bookmarkInUse[10] = { false, false, false, false, false, false, false, false, false, false }; @@ -344,7 +344,7 @@ void CGameView::RotateAboutTarget() void CGameView::Update(float DeltaTime) { - if (!g_active) + if (!g_app_has_focus) return; float delta = powf( m_ViewSnapSmoothness, DeltaTime ); @@ -592,7 +592,7 @@ InReaction game_view_handler(const SDL_Event* ev) { // put any events that must be processed even if inactive here - if(!g_active || !g_Game) + if(!g_app_has_focus || !g_Game) return IN_PASS; CGameView *pView=g_Game->GetView(); diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index 45c8bc797e..0bfa6ddb23 100755 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -255,12 +255,11 @@ InReaction CGUI::HandleEvent(const SDL_Event* ev) // Handle keys for input boxes if (GetFocusedObject()) { - Uint8* keys = SDL_GetKeyState(0); if ( (ev->type == SDL_KEYDOWN && ev->key.keysym.sym != SDLK_ESCAPE && - !keys[SDLK_LCTRL] && !keys[SDLK_RCTRL] && - !keys[SDLK_LALT] && !keys[SDLK_RALT]) + !g_keys[SDLK_LCTRL] && !g_keys[SDLK_RCTRL] && + !g_keys[SDLK_LALT] && !g_keys[SDLK_RALT]) || ev->type == SDL_HOTKEYDOWN ) { diff --git a/source/gui/CInput.cpp b/source/gui/CInput.cpp index ae7f519a8c..bb2e822b1d 100755 --- a/source/gui/CInput.cpp +++ b/source/gui/CInput.cpp @@ -63,8 +63,6 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) // pointer and edit that. CStrW *pCaption = (CStrW*)m_Settings["caption"].m_pSetting; - Uint8* keys = SDL_GetKeyState(0); - if (ev->type == SDL_HOTKEYDOWN) { if (ev->user.code == HOTKEY_CONSOLE_PASTE) @@ -151,7 +149,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) case SDLK_HOME: // If there's not a selection, we should create one now - if (!keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -170,7 +168,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) case SDLK_END: // If there's not a selection, we should create one now - if (!keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -213,11 +211,11 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) // reset m_WantedX, very important m_WantedX=0.f; - if (keys[SDLK_RSHIFT] || keys[SDLK_LSHIFT] || + if (g_keys[SDLK_RSHIFT] || g_keys[SDLK_LSHIFT] || !SelectingText()) { // If there's not a selection, we should create one now - if (!SelectingText() && !keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!SelectingText() && !g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -245,11 +243,11 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) case SDLK_RIGHT: m_WantedX=0.f; - if (keys[SDLK_RSHIFT] || keys[SDLK_LSHIFT] || + if (g_keys[SDLK_RSHIFT] || g_keys[SDLK_LSHIFT] || !SelectingText()) { // If there's not a selection, we should create one now - if (!SelectingText() && !keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!SelectingText() && !g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -298,7 +296,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) case SDLK_UP: { // If there's not a selection, we should create one now - if (!keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -346,7 +344,7 @@ InReaction CInput::ManuallyHandleEvent(const SDL_Event* ev) case SDLK_DOWN: { // If there's not a selection, we should create one now - if (!keys[SDLK_RSHIFT] && !keys[SDLK_LSHIFT]) + if (!g_keys[SDLK_RSHIFT] && !g_keys[SDLK_LSHIFT]) { // Make sure a selection isn't created. m_iBufferPos_Tail = -1; @@ -454,8 +452,6 @@ void CInput::HandleMessage(const SGUIMessage &Message) // TODO Gee: IGUIScrollBarOwner::HandleMessage(Message); - Uint8* keys = SDL_GetKeyState(0); - switch (Message.type) { case GUIM_SETTINGS_UPDATED: @@ -533,7 +529,7 @@ void CInput::HandleMessage(const SGUIMessage &Message) // instance, if we press between a and b, the point // should of course be placed accordingly. Other // special cases are handled like the input box norms. - if (keys[SDLK_RSHIFT] || keys[SDLK_LSHIFT]) + if (g_keys[SDLK_RSHIFT] || g_keys[SDLK_LSHIFT]) { m_iBufferPos = GetMouseHoveringTextPosition(); } diff --git a/source/lib/sysdep/win/wsdl.cpp b/source/lib/sysdep/win/wsdl.cpp index c8807a1cff..2f1f1754ba 100755 --- a/source/lib/sysdep/win/wsdl.cpp +++ b/source/lib/sysdep/win/wsdl.cpp @@ -96,8 +96,6 @@ static HGLRC hGLRC = (HGLRC)INVALID_HANDLE_VALUE; static int depth_bits = 24; // depth buffer size; set via SDL_GL_SetAttribute -static u16 mouse_x, mouse_y; - Uint8 SDL_GetAppState() { @@ -352,6 +350,22 @@ Uint8* SDL_GetKeyState(int* num_keys) } +//---------------------------------------------------------------------------- + +static u16 mouse_x, mouse_y; + +static uint mouse_buttons; + +Uint8 SDL_GetMouseState(int* x, int* y) +{ + if(x) + *x = (int)mouse_x; + if(y) + *y = (int)mouse_y; + return (Uint8)mouse_buttons; +} + + //---------------------------------------------------------------------------- static LRESULT CALLBACK wndproc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) @@ -545,6 +559,12 @@ static LRESULT CALLBACK wndproc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lPar outstanding_press_events = 0; } + // update bits + if(state == SDL_PRESSED) + mouse_buttons |= SDL_BUTTON(button); + else + mouse_buttons &= ~SDL_BUTTON(button); + uint x = LOWORD(lParam); uint y = HIWORD(lParam); queue_button_event(button, state, x, y); diff --git a/source/lib/sysdep/win/wsdl.h b/source/lib/sysdep/win/wsdl.h index 6fffd14ebc..3cded3b299 100755 --- a/source/lib/sysdep/win/wsdl.h +++ b/source/lib/sysdep/win/wsdl.h @@ -213,6 +213,11 @@ enum SDL_MouseButtonEvent_button SDL_BUTTON_WHEELDOWN = 5 }; +#define SDL_BUTTON(b) (SDL_PRESSED << (b-1)) +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) + enum SDL_MouseButtonEvent_state { SDL_RELEASED = 0, @@ -283,94 +288,10 @@ extern int SDL_PushEvent(SDL_Event* ev); extern void SDL_WM_SetCaption(const char *title, const char *icon); extern Uint8* SDL_GetKeyState(int* num_keys); +extern Uint8 SDL_GetMouseState(int* x, int* y); - - - - - - - - - - -// glutInitDisplayMode -#define GLUT_RGB 0 -#define GLUT_DOUBLE 0 -#define GLUT_DEPTH 0 - -// mouse buttons -enum -{ - GLUT_LEFT_BUTTON, - GLUT_RIGHT_BUTTON, - GLUT_MIDDLE_BUTTON // also wheel, if avail -}; - -// mouse button state -enum -{ - GLUT_DOWN, - GLUT_UP -}; - -// keys -enum -{ - GLUT_KEY_LEFT = 0x25, // VK_* - GLUT_KEY_RIGHT = 0x27, - GLUT_KEY_UP = 0x26, - GLUT_KEY_DOWN = 0x28 -}; - - -// glutSetCursor -#define GLUT_CURSOR_INHERIT 32512 // IDC_* -#define GLUT_CURSOR_WAIT 32514 -#define GLUT_CURSOR_DESTROY 32648 -#define GLUT_CURSOR_NONE 0 - -// glutGet -enum -{ -GLUT_ELAPSED_TIME, -GLUT_SCREEN_WIDTH, -GLUT_SCREEN_HEIGHT, - -GLUT_GAME_MODE_WIDTH, -GLUT_GAME_MODE_HEIGHT, -GLUT_GAME_MODE_PIXEL_DEPTH, -GLUT_GAME_MODE_REFRESH_RATE -}; - - - -extern void glutIdleFunc(void(*)()); -extern void glutDisplayFunc(void(*)()); -extern void glutKeyboardFunc(void(*)(int, int, int)); -extern void glutSpecialFunc(void(*)(int, int, int)); -extern void glutMouseFunc(void(*)(int, int, int, int)); - - -#define glutInitDisplayMode(a) // pixel format is hardwired - -extern int glutGameModeString(const char* str); - - - -extern void glutInit(int* argc, char* argv[]); -extern int glutGet(int arg); -extern int glutEnterGameMode(void); -extern void glutMainLoop(void); - -extern void glutPostRedisplay(void); - -extern void glutSetCursor(int); - - - -#define glutSwapBuffers SDL_GL_SwapBuffers - +//( SDLMod and KMOD_* already defined by SDL_keysym.h) +extern SDLMod SDL_GetModState(void); #ifdef __cplusplus diff --git a/source/main.cpp b/source/main.cpp index bb9be48ff8..096486ead4 100755 --- a/source/main.cpp +++ b/source/main.cpp @@ -26,16 +26,17 @@ that of Atlas depending on commandline parameters. #include "ps/GameSetup/Atlas.h" #include "ps/GameSetup/Config.h" #include "ps/Loader.h" -#include "gui/GUI.h" #include "ps/CConsole.h" #include "ps/Profile.h" #include "ps/Util.h" #include "ps/Game.h" #include "ps/Hotkey.h" +#include "ps/Globals.h" #include "ps/Interact.h" #include "ps/Network/SessionManager.h" #include "simulation/Scheduler.h" #include "sound/CMusicPlayer.h" +#include "gui/GUI.h" #define LOG_CATEGORY "main" @@ -129,54 +130,87 @@ static void Frame() MICROLOG(L"Frame"); oglCheck(); - const uint app_state = SDL_GetAppState(); - - PROFILE_START( "update music" ); - music_player.update(); - PROFILE_END( "update music" ); - + // get elapsed time calc_fps(); -// old method - "exact" but contains jumps + // .. old method - "exact" but contains jumps #if 0 static double last_time; const double time = get_time(); const float TimeSinceLastFrame = (float)(time-last_time); last_time = time; ONCE(return); // first call: set last_time and return - -// new method - filtered and more smooth, but errors may accumulate + + // .. new method - filtered and more smooth, but errors may accumulate #else const float TimeSinceLastFrame = spf; #endif debug_assert(TimeSinceLastFrame >= 0.0f); - PROFILE_START( "reload changed files" ); - MICROLOG(L"reload files"); + // decide if update/render is necessary + bool need_render, need_update; + if(g_app_minimized) + { + // TODO: eventually update ought to be re-enabled so the server host + // can Alt+Tab out without the match hanging. however, game updates + // are currently really slow and disabling them makes debugging nicer. + need_update = false; + need_render = false; + + // inactive; relinquish CPU for a little while + // don't use SDL_WaitEvent: don't want the main loop to freeze until app focus is restored + SDL_Delay(10); + } + else if(!g_app_has_focus) + { + need_update = false; // see above + need_render = true; + + SDL_Delay(5); // see above + } + // active + else + { + need_update = true; + need_render = true; + } + // TODO: throttling: limit update and render frequency to the minimum. + // this is mostly relevant for "inactive" state, so that other windows + // get enough CPU time, but it's always nice for power+thermal management. + + + PROFILE_START( "update music" ); + music_player.update(); + PROFILE_END( "update music" ); + + PROFILE_START("reload changed files"); + MICROLOG(L"reload changed files"); vfs_reload_changed_files(); - PROFILE_END( "reload changed files" ); + PROFILE_END( "reload changed files"); - PROFILE_START( "progressive load" ); + PROFILE_START("progressive load"); + MICROLOG(L"progressive load"); ProgressiveLoad(); - PROFILE_END( "progressive load" ); + PROFILE_END( "progressive load"); - PROFILE_START( "input" ); + PROFILE_START("input"); MICROLOG(L"input"); PumpEvents(); g_SessionManager.Poll(); - PROFILE_END( "input" ); + PROFILE_END("input"); oglCheck(); - PROFILE_START( "gui tick" ); + PROFILE_START("gui tick"); + MICROLOG(L"gui tick"); #ifndef NO_GUI g_GUI.TickObjects(); #endif - PROFILE_END( "gui tick" ); + PROFILE_END("gui tick"); oglCheck(); PROFILE_START( "game logic" ); - if (g_Game && g_Game->IsGameStarted()) + if (g_Game && g_Game->IsGameStarted() && need_update) { PROFILE_START( "simulation update" ); g_Game->Update(TimeSinceLastFrame); @@ -221,11 +255,9 @@ static void Frame() g_Console->Update(TimeSinceLastFrame); PROFILE_END( "update console" ); - PROFILE_START( "render" ); + PROFILE_START("render"); oglCheck(); - - - if(app_state & SDL_APPACTIVE) + if(need_render) { MICROLOG(L"render"); Render(); @@ -234,20 +266,14 @@ static void Frame() SDL_GL_SwapBuffers(); PROFILE_END( "swap buffers" ); } - // inactive; relinquish CPU for a little while - // don't use SDL_WaitEvent: don't want the main loop to freeze until app focus is restored - else - SDL_Delay(5); - oglCheck(); - PROFILE_END( "render" ); + PROFILE_END("render"); g_Profiler.Frame(); if(g_FixedFrameTiming && frameCount==100) kill_mainloop(); - // clear terrain modified flag g_TerrainModified = false; } diff --git a/source/ps/CConsole.cpp b/source/ps/CConsole.cpp index f0a4196479..d709cf55cc 100755 --- a/source/ps/CConsole.cpp +++ b/source/ps/CConsole.cpp @@ -280,6 +280,7 @@ void CConsole::DrawBuffer(void) void CConsole::DrawCursor(void) { + // (glPushMatrix is necessary because glwprintf does glTranslatef) glPushMatrix(); // Slightly translucent yellow glColor4f(1.0f, 1.0f, 0.0f, 0.8f); @@ -301,8 +302,6 @@ void CConsole::InsertChar(const int szChar, const wchar_t cooked ) if (!m_bVisible) return; - Uint8* keys = SDL_GetKeyState(0); - switch (szChar){ case '\r': case '\n': @@ -346,7 +345,7 @@ void CConsole::InsertChar(const int szChar, const wchar_t cooked ) return; case SDLK_HOME: - if (keys[SDLK_RCTRL] || keys[SDLK_LCTRL]) + if (g_keys[SDLK_RCTRL] || g_keys[SDLK_LCTRL]) { int linesShown = (int)m_fHeight/m_iFontHeight - 4; m_iMsgHistPos = clamp((int)m_deqMsgHistory.size() - linesShown, 1, (int)m_deqMsgHistory.size()); @@ -358,7 +357,7 @@ void CConsole::InsertChar(const int szChar, const wchar_t cooked ) return; case SDLK_END: - if (keys[SDLK_RCTRL] || keys[SDLK_LCTRL]) + if (g_keys[SDLK_RCTRL] || g_keys[SDLK_LCTRL]) { m_iMsgHistPos = 1; } @@ -673,8 +672,8 @@ InReaction conInputHandler(const SDL_Event* ev) // SB: Not safe, really.. Swedish keyboards have {[]} on AltGr (Ctrl-Alt) // for example, so I commented those tests. if( ( ev->key.keysym.sym != SDLK_ESCAPE ) && - /*!keys[SDLK_LCTRL] && !keys[SDLK_RCTRL] && - !keys[SDLK_LALT] && !keys[SDLK_RALT] &&*/ + /*!g_keys[SDLK_LCTRL] && !g_keys[SDLK_RCTRL] && + !g_keys[SDLK_LALT] && !g_keys[SDLK_RALT] &&*/ !hotkeys[HOTKEY_CONSOLE_TOGGLE] ) g_Console->InsertChar(sym, (wchar_t)ev->key.keysym.unicode ); diff --git a/source/ps/Globals.cpp b/source/ps/Globals.cpp index d909cde24f..74bce0f51c 100644 --- a/source/ps/Globals.cpp +++ b/source/ps/Globals.cpp @@ -4,14 +4,15 @@ #include "Globals.h" -bool g_active = true; +bool g_app_minimized = false; +bool g_app_has_focus = true; -bool g_keys[SDLK_LAST]; +bool g_keys[SDLK_LAST] = {0}; int g_mouse_x = 50, g_mouse_y = 50; // unused, left, right, middle, wheel up, wheel down // (order is given by SDL_BUTTON_* constants). -bool g_mouse_buttons[6]; +bool g_mouse_buttons[6] = {0}; // updates the state of the above; never swallows messages. @@ -23,7 +24,9 @@ InReaction GlobalsInputHandler(const SDL_Event* ev) { case SDL_ACTIVEEVENT: if(ev->active.state & SDL_APPACTIVE) - g_active = (ev->active.gain != 0); + g_app_minimized = (ev->active.gain == 0); // negated + if(ev->active.state & SDL_APPINPUTFOCUS) + g_app_has_focus = (ev->active.gain != 0); return IN_PASS; case SDL_MOUSEMOTION: @@ -40,6 +43,19 @@ InReaction GlobalsInputHandler(const SDL_Event* ev) debug_warn("invalid mouse button"); return IN_PASS; + case SDL_KEYDOWN: + case SDL_KEYUP: + c = ev->key.keysym.sym; + if(c < ARRAY_SIZE(g_keys)) + g_keys[c] = (ev->type == SDL_KEYDOWN); + else + { + // don't complain: this happens when the hotkey system + // spoofs keys (it assigns values starting from SDLK_LAST) + //debug_warn("invalid key"); + } + return IN_PASS; + default: return IN_PASS; } diff --git a/source/ps/Globals.h b/source/ps/Globals.h index a4acac793c..702666268e 100644 --- a/source/ps/Globals.h +++ b/source/ps/Globals.h @@ -1,14 +1,30 @@ -extern bool g_active; +#include "lib/input.h" +#include "lib/sdl.h" + +// thin abstraction layer on top of SDL. +// game code should use it instead of SDL_GetMouseState etc. because +// Atlas does not completely emulate SDL (it can only send events). + +extern bool g_app_minimized; +extern bool g_app_has_focus; extern int g_mouse_x, g_mouse_y; +/** + * g_keys: Key states, indexed by SDLK* constants. If an entry is true, + * it represents a pressed key. + * Updated by GlobalsInputHandler in response to key press/release events. + */ +extern bool g_keys[SDLK_LAST]; /** - * g_mouse_buttons: Mouse buttons states, indexed by SDL_BUTTON_* constants. If an entry - * is true, it represents a pressed button. + * g_mouse_buttons: Mouse buttons states, indexed by SDL_BUTTON_* constants. + * If an entry is true, it represents a pressed button. + * Updated by GlobalsInputHandler in response to mouse button up/down events. * - * Be aware that SDL_BUTTON_* constants start at 1. Therefore, g_mouse_buttons[0] is unused. - * Thus, the order of entries is { unused, left, right, middle, wheel up, wheel down } + * Be aware that SDL_BUTTON_* constants start at 1. Therefore, + * g_mouse_buttons[0] is unused. The order of entries is: + * { unused, left, right, middle, wheel up, wheel down } */ extern bool g_mouse_buttons[6]; diff --git a/source/ps/Hotkey.cpp b/source/ps/Hotkey.cpp index 5d36705a03..57e63bd94e 100755 --- a/source/ps/Hotkey.cpp +++ b/source/ps/Hotkey.cpp @@ -10,7 +10,7 @@ extern CConsole* g_Console; -static Uint8 unified[5]; +static bool unified[5]; /* SDL-type */ @@ -47,7 +47,7 @@ const int HK_MAX_KEYCODES = UNIFIED_SUPER + 1; static KeyMapping hotkeyMap[HK_MAX_KEYCODES]; // An array of the status of virtual keys -Uint8 hotkeys[HOTKEY_LAST]; +bool hotkeys[HOTKEY_LAST]; struct SHotkeyInfo @@ -320,7 +320,6 @@ void hotkeyRegisterGUIObject( const CStr& objName, const CStr& hotkeyName ) InReaction hotkeyInputHandler( const SDL_Event* ev ) { int keycode = 0; - Uint8* keys = SDL_GetKeyState(0); switch( ev->type ) { @@ -426,17 +425,17 @@ InReaction hotkeyInputHandler( const SDL_Event* ev ) for( itKey = it->requires.begin(); itKey != it->requires.end(); itKey++ ) { int keyCode = *itKey & ~HOTKEY_NEGATION_FLAG; // Clear the negation-modifier bit - Uint8 rqdState = ( *itKey & HOTKEY_NEGATION_FLAG ) == 0; + bool rqdState = ( *itKey & HOTKEY_NEGATION_FLAG ) == 0; // debug_assert( !rqdState ); if( keyCode < SDLK_LAST ) { - if( keys[keyCode] != rqdState ) accept = false; + if( g_keys[keyCode] != rqdState ) accept = false; } else if( keyCode < UNIFIED_SHIFT ) { - if( (Uint8)g_mouse_buttons[keyCode-SDLK_LAST] != rqdState ) accept = false; + if( g_mouse_buttons[keyCode-SDLK_LAST] != rqdState ) accept = false; } else if( (uint)(keyCode-UNIFIED_SHIFT) < ARRAY_SIZE(unified) ) { @@ -497,15 +496,15 @@ InReaction hotkeyInputHandler( const SDL_Event* ev ) for( itKey = itGUI->requires.begin(); itKey != itGUI->requires.end(); itKey++ ) { int keyCode = *itKey & ~HOTKEY_NEGATION_FLAG; // Clear the negation-modifier bit - Uint8 rqdState = ( *itKey & HOTKEY_NEGATION_FLAG ) == 0; + bool rqdState = ( *itKey & HOTKEY_NEGATION_FLAG ) == 0; if( keyCode < SDLK_LAST ) { - if( keys[keyCode] != rqdState ) accept = false; + if( g_keys[keyCode] != rqdState ) accept = false; } else if( keyCode < UNIFIED_SHIFT ) { - if( (Uint8)g_mouse_buttons[keyCode-SDLK_LAST] != rqdState ) accept = false; + if( g_mouse_buttons[keyCode-SDLK_LAST] != rqdState ) accept = false; } else if( (uint)(keyCode-UNIFIED_SHIFT) < ARRAY_SIZE(unified) ) { @@ -572,7 +571,7 @@ InReaction hotkeyInputHandler( const SDL_Event* ev ) { if( *itKey < SDLK_LAST ) { - if( !keys[*itKey] ) accept = false; + if( !g_keys[*itKey] ) accept = false; } else if( *itKey < UNIFIED_SHIFT ) { diff --git a/source/ps/Hotkey.h b/source/ps/Hotkey.h index eda36a4c18..05d4a32dbe 100755 --- a/source/ps/Hotkey.h +++ b/source/ps/Hotkey.h @@ -112,4 +112,4 @@ extern int getKeyCode( CStr keyname ); extern bool keyRespondsTo( int hotkey, int sdlkey ); -extern Uint8 hotkeys[HOTKEY_LAST]; +extern bool hotkeys[HOTKEY_LAST]; diff --git a/source/ps/Interact.cpp b/source/ps/Interact.cpp index 3cb9209871..38d4504daf 100755 --- a/source/ps/Interact.cpp +++ b/source/ps/Interact.cpp @@ -10,6 +10,7 @@ #include "Hotkey.h" #include "timer.h" #include "Game.h" +#include "ps/Globals.h" #include "Network/NetMessage.h" #include "BoundingObjects.h" #include "Unit.h" @@ -20,8 +21,6 @@ #include "MathUtil.h" extern CConsole* g_Console; -extern int g_mouse_x, g_mouse_y; -extern bool g_active; extern CStr g_CursorName; static const double SELECT_DBLCLICK_RATE = 0.5; @@ -827,7 +826,7 @@ void MouseButtonUpHandler(const SDL_Event *ev, int clicks) InReaction interactInputHandler( const SDL_Event* ev ) { - if (!g_active || !g_Game) + if (!g_app_has_focus || !g_Game) return IN_PASS; CGameView *pView=g_Game->GetView();