Mercurial > hg > openttd
changeset 5086:32cae40dc734 draft
(svn r7153) -Fix [FS#279]: Some keyboard events possibly lost under high CPU load, handle
keyboard input in place instead of global variables magic. (KUDr)
author | Darkvater <Darkvater@openttd.org> |
---|---|
date | Wed, 15 Nov 2006 19:35:52 +0000 |
parents | 419df0d3fbf8 |
children | 5127696e093b |
files | variables.h video/cocoa_v.m video/sdl_v.c video/win32_v.c window.c window.h |
diffstat | 6 files changed, 27 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/variables.h +++ b/variables.h @@ -282,7 +282,6 @@ VARDEF uint32 _decode_parameters[20]; -VARDEF uint32 _pressed_key; // Low 8 bits = ASCII, High 16 bits = keycode VARDEF bool _ctrl_pressed; // Is Ctrl pressed? VARDEF bool _shift_pressed; // Is Shift pressed? VARDEF byte _dirkeys; // 1 = left, 2 = up, 4 = right, 8 = down
--- a/video/cocoa_v.m +++ b/video/cocoa_v.m @@ -347,8 +347,9 @@ } if (down) { - _pressed_key = QZ_MapKey(keycode) | unicode; - DEBUG(driver, 2)("cocoa_v: QZ_KeyEvent: %x (%x), down, mapping: %x", keycode, unicode, _pressed_key); + uint32 pressed_key = QZ_MapKey(keycode) | unicode; + HandleKeypress(pressed_key); + DEBUG(driver, 2)("cocoa_v: QZ_KeyEvent: %x (%x), down, mapping: %x", keycode, unicode, pressed_key); } else { DEBUG(driver, 2)("cocoa_v: QZ_KeyEvent: %x (%x), up", keycode, unicode); }
--- a/video/sdl_v.c +++ b/video/sdl_v.c @@ -380,9 +380,8 @@ (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_f)) { ToggleFullScreen(!_fullscreen); } else { - _pressed_key = ConvertSdlKeyIntoMy(&ev.key.keysym); + HandleKeypress(ConvertSdlKeyIntoMy(&ev.key.keysym)); } - break; case SDL_VIDEORESIZE: {
--- a/video/win32_v.c +++ b/video/win32_v.c @@ -346,23 +346,25 @@ WORD w = 0; byte ks[256]; uint scancode; + uint32 pressed_key; GetKeyboardState(ks); if (ToAscii(wParam, 0, ks, &w, 0) == 0) { w = 0; // no translation was possible } - _pressed_key = w | MapWindowsKey(wParam) << 16; + pressed_key = w | MapWindowsKey(wParam) << 16; scancode = GB(lParam, 16, 8); - if (scancode == 41) _pressed_key = w | WKC_BACKQUOTE << 16; + if (scancode == 41) pressed_key = w | WKC_BACKQUOTE << 16; - if ((_pressed_key >> 16) == ('D' | WKC_CTRL) && !_wnd.fullscreen) { + if ((pressed_key >> 16) == ('D' | WKC_CTRL) && !_wnd.fullscreen) { _double_size ^= 1; _wnd.double_size = _double_size; ClientSizeChanged(_wnd.width, _wnd.height); MarkWholeScreenDirty(); } + HandleKeypress(pressed_key); break; } @@ -377,11 +379,11 @@ return 0; // do nothing case VK_F10: /* F10, ignore activation of menu */ - _pressed_key = MapWindowsKey(wParam) << 16; + HandleKeypress(MapWindowsKey(wParam) << 16); return 0; default: /* ALT in combination with something else */ - _pressed_key = MapWindowsKey(wParam) << 16; + HandleKeypress(MapWindowsKey(wParam) << 16); break; } break;
--- a/window.c +++ b/window.c @@ -1397,7 +1397,10 @@ } } -static void HandleKeypress(uint32 key) +/** Handle keyboard input. + * @param key Lower 8 bits contain the ASCII character, the higher + * 16 bits the keycode */ +void HandleKeypress(uint32 key) { Window *w; WindowEvent e; @@ -1406,6 +1409,17 @@ * to thein this main toolbar. */ bool query_open = false; + /* + * During the generation of the world, there might be + * another thread that is currently building for example + * a road. To not interfere with those tasks, we should + * NOT change the _current_player here. + * + * This is not necessary either, as the only events that + * can be handled are the 'close application' events + */ + if (!IsGeneratingWorld()) _current_player = _local_player; + // Setup event e.event = WE_KEYPRESS; e.we.keypress.ascii = key & 0xFF; @@ -1564,12 +1578,6 @@ */ if (!IsGeneratingWorld()) _current_player = _local_player; - // Handle pressed keys - if (_pressed_key != 0) { - HandleKeypress(_pressed_key); - _pressed_key = 0; - } - // Mouse event? click = 0; if (_left_button_down && !_left_button_clicked) {
--- a/window.h +++ b/window.h @@ -801,6 +801,7 @@ void ResetWindowSystem(void); int GetMenuItemIndex(const Window *w, int x, int y); void InputLoop(void); +void HandleKeypress(uint32 key); void UpdateWindows(void); void InvalidateWidget(const Window *w, byte widget_index); void InvalidateThisWindowData(Window *w);