Changeset - r5086:b3c6dfb3476b
[Not reviewed]
master
0 6 0
Darkvater - 18 years ago 2006-11-15 19:35:52
darkvater@openttd.org
(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)
6 files changed with 27 insertions and 17 deletions:
0 comments (0 inline, 0 general)
variables.h
Show inline comments
 
@@ -282,7 +282,6 @@ VARDEF int32 _additional_cash_required;
 

	
 
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
video/cocoa_v.m
Show inline comments
 
@@ -347,8 +347,9 @@ static void QZ_KeyEvent(unsigned short k
 
	}
 

	
 
	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);
 
	}
video/sdl_v.c
Show inline comments
 
@@ -380,9 +380,8 @@ static int PollEvent(void)
 
					(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: {
video/win32_v.c
Show inline comments
 
@@ -346,23 +346,25 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 
			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 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 
					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;
window.c
Show inline comments
 
@@ -1397,7 +1397,10 @@ void SendWindowMessageClass(WindowClass 
 
	}
 
}
 

	
 
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 @@ static void HandleKeypress(uint32 key)
 
	 * 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 @@ void InputLoop(void)
 
	 */
 
	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) {
window.h
Show inline comments
 
@@ -801,6 +801,7 @@ void UnInitWindowSystem(void);
 
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);
0 comments (0 inline, 0 general)