diff --git a/functions.h b/functions.h --- a/functions.h +++ b/functions.h @@ -233,6 +233,7 @@ void LoadFromConfig(void); void SaveToConfig(void); void CheckConfig(void); int ttd_main(int argc, char* argv[]); +void HandleExitGameRequest(void); void DeterminePaths(void); diff --git a/intro_gui.c b/intro_gui.c --- a/intro_gui.c +++ b/intro_gui.c @@ -77,7 +77,7 @@ static void SelectGameWndProc(Window *w, case 12: ShowGameOptions(); break; case 13: ShowGameDifficulty(); break; case 14: ShowPatchesSelection(); break; - case 15: AskExitGame(); break; + case 15: HandleExitGameRequest(); break; } break; diff --git a/main_gui.c b/main_gui.c --- a/main_gui.c +++ b/main_gui.c @@ -170,14 +170,14 @@ static void MenuClickSaveLoad(int index) case 0: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break; case 1: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break; case 2: AskExitToGameMenu(); break; - case 4: AskExitGame(); break; + case 4: HandleExitGameRequest(); break; } } else { switch (index) { case 0: ShowSaveLoadDialog(SLD_SAVE_GAME); break; case 1: ShowSaveLoadDialog(SLD_LOAD_GAME); break; case 2: AskExitToGameMenu(); break; - case 3: AskExitGame(); break; + case 3: HandleExitGameRequest(); break; } } } @@ -2226,7 +2226,7 @@ static void MainWindowWndProc(Window *w, switch (e->keypress.keycode) { case 'Q' | WKC_CTRL: case 'Q' | WKC_META: - AskExitGame(); + HandleExitGameRequest(); break; } diff --git a/openttd.c b/openttd.c --- a/openttd.c +++ b/openttd.c @@ -537,6 +537,19 @@ int ttd_main(int argc, char *argv[]) return 0; } +void HandleExitGameRequest(void) +{ + if (_game_mode == GM_MENU) { // do not ask to quit on the main screen + _exit_game = true; + } else if (_patches.autosave_on_exit) { + DoExitSave(); + _exit_game = true; + } else { + AskExitGame(); + } +} + + /** Mutex so that only one thread can communicate with the main program * at any given time */ static ThreadMsg _message = MSG_OTTD_NO_MESSAGE; diff --git a/saveload.h b/saveload.h --- a/saveload.h +++ b/saveload.h @@ -20,6 +20,7 @@ typedef enum SaveOrLoadMode { SaveOrLoadResult SaveOrLoad(const char *filename, int mode); void WaitTillSaved(void); +void DoExitSave(void); typedef void ChunkSaveLoadProc(void); diff --git a/video/cocoa_v.m b/video/cocoa_v.m --- a/video/cocoa_v.m +++ b/video/cocoa_v.m @@ -197,22 +197,6 @@ static void QZ_CheckPaletteAnim(void) -extern void DoExitSave(void); - -static void QZ_AskQuit(void) -{ - if (_game_mode == GM_MENU) { // do not ask to quit on the main screen - _exit_game = true; - } else if (_patches.autosave_on_exit) { - DoExitSave(); - _exit_game = true; - } else { - AskExitGame(); - } -} - - - typedef struct VkMapping { unsigned short vk_from; byte map_to; @@ -921,7 +905,7 @@ static void QZ_SetPortAlphaOpaque(void) @implementation OTTD_QuartzWindowDelegate - (BOOL)windowShouldClose:(id)sender { - QZ_AskQuit(); + HandleExitGameRequest(); return NO; } diff --git a/video/sdl_v.c b/video/sdl_v.c --- a/video/sdl_v.c +++ b/video/sdl_v.c @@ -303,8 +303,6 @@ static uint32 ConvertSdlKeyIntoMy(SDL_ke return (key << 16) + sym->unicode; } -extern void DoExitSave(void); - static int PollEvent(void) { SDL_Event ev; @@ -376,21 +374,9 @@ static int PollEvent(void) } break; - case SDL_QUIT: - // do not ask to quit on the main screen - if (_game_mode != GM_MENU) { - if (_patches.autosave_on_exit) { - DoExitSave(); - return 0; - } else { - AskExitGame(); - } - } else { - return 0; - } - break; + case SDL_QUIT: HandleExitGameRequest(); break; - case SDL_KEYDOWN: /* Toggle full-screen on ALT + ENTER/F */ + case SDL_KEYDOWN: /* Toggle full-screen on ALT + ENTER/F */ if ((ev.key.keysym.mod & (KMOD_ALT | KMOD_META)) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_f)) { ToggleFullScreen(!_fullscreen); @@ -448,8 +434,6 @@ static void SdlVideoMainLoop(void) InteractiveRandom(); // randomness while ((i = PollEvent()) == -1) {} - if (i >= 0) return; - if (_exit_game) return; mod = SDL_CALL SDL_GetModState(); diff --git a/video/win32_v.c b/video/win32_v.c --- a/video/win32_v.c +++ b/video/win32_v.c @@ -151,8 +151,6 @@ static void ClientSizeChanged(int w, int } } -extern void DoExitSave(void); - #ifdef _DEBUG // Keep this function here.. // It allows you to redraw the screen from within the MSVC debugger @@ -256,14 +254,7 @@ static LRESULT CALLBACK WndProcGdi(HWND } case WM_CLOSE: - if (_game_mode == GM_MENU) { // do not ask to quit on the main screen - _exit_game = true; - } else if (_patches.autosave_on_exit) { - DoExitSave(); - _exit_game = true; - } else { - AskExitGame(); - } + HandleExitGameRequest(); _window_maximize = IsZoomed(_wnd.main_wnd); return 0;