diff options
author | Darkvater <darkvater@openttd.org> | 2006-09-14 20:40:59 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2006-09-14 20:40:59 +0000 |
commit | 2d329463bf7b3d0146a64d19207721756837d924 (patch) | |
tree | 89f314fa59d4e50c5b6a466b26d344f5f71b755e /video | |
parent | 8c32826088f7ea1b2b366deedb53833b87e65712 (diff) | |
download | openttd-2d329463bf7b3d0146a64d19207721756837d924.tar.xz |
(svn r6449) -Fix (Win32): The dedicated server could overwrite the keyboard input buffer
before it was handled by OpenTTD. Thanks to glx for noticing.
-While here, also do really minor coding style, and proper variable names.
Diffstat (limited to 'video')
-rw-r--r-- | video/dedicated_v.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/video/dedicated_v.c b/video/dedicated_v.c index 953368f99..4ec281f64 100644 --- a/video/dedicated_v.c +++ b/video/dedicated_v.c @@ -64,8 +64,8 @@ static void DedicatedSignalHandler(int sig) #include <windows.h> /* GetTickCount */ #include <conio.h> #include <time.h> -static HANDLE hEvent; -static HANDLE hThread; // Thread to close +static HANDLE _hInputReady, _hWaitForInputHandling; +static HANDLE _hThread; // Thread to close static char _win_console_thread_buffer[200]; /* Windows Console thread. Just loop and signal when input has been received */ @@ -73,30 +73,32 @@ static void WINAPI CheckForConsoleInput(void) { while (true) { fgets(_win_console_thread_buffer, lengthof(_win_console_thread_buffer), stdin); - SetEvent(hEvent); // signal input waiting that the line is ready + /* Signal input waiting that input is read and wait for it being handled + * SignalObjectAndWait() should be used here, but it's unsupported in Win98< */ + SetEvent(_hInputReady); + WaitForSingleObject(_hWaitForInputHandling, INFINITE); } } static void CreateWindowsConsoleThread(void) { - static char tbuffer[9]; DWORD dwThreadId; /* Create event to signal when console input is ready */ - hEvent = CreateEvent(NULL, false, false, _strtime(tbuffer)); - if (hEvent == NULL) - error("Cannot create console event!"); + _hInputReady = CreateEvent(NULL, false, false, NULL); + _hWaitForInputHandling = CreateEvent(NULL, false, false, NULL); + if (_hInputReady == NULL || _hWaitForInputHandling == NULL) error("Cannot create console event!"); - hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CheckForConsoleInput, NULL, 0, &dwThreadId); - if (hThread == NULL) - error("Cannot create console thread!"); + _hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CheckForConsoleInput, NULL, 0, &dwThreadId); + if (_hThread == NULL) error("Cannot create console thread!"); DEBUG(driver, 1) ("Windows console thread started..."); } static void CloseWindowsConsoleThread(void) { - CloseHandle(hThread); - CloseHandle(hEvent); + CloseHandle(_hThread); + CloseHandle(_hInputReady); + CloseHandle(_hWaitForInputHandling); DEBUG(driver, 1) ("Windows console thread shut down..."); } @@ -174,7 +176,7 @@ static uint32 GetTime(void) static bool InputWaiting(void) { - return WaitForSingleObject(hEvent, 1) == WAIT_OBJECT_0; + return WaitForSingleObject(_hInputReady, 1) == WAIT_OBJECT_0; } static uint32 GetTime(void) @@ -188,16 +190,16 @@ static void DedicatedHandleKeyInput(void) { static char input_line[200] = ""; - if (!InputWaiting()) - return; + if (!InputWaiting()) return; - if (_exit_game) - return; + if (_exit_game) return; #if defined(UNIX) || defined(__OS2__) - fgets(input_line, lengthof(input_line), stdin); + fgets(input_line, lengthof(input_line), stdin); #else - strncpy(input_line, _win_console_thread_buffer, lengthof(input_line)); + /* Handle console input, and singal console thread, it can accept input again */ + strncpy(input_line, _win_console_thread_buffer, lengthof(input_line)); + SetEvent(_hWaitForInputHandling); #endif /* XXX - strtok() does not 'forget' \n\r if it is the first character! */ |