diff options
| -rw-r--r-- | gui/EditTextWidget.cpp | 26 | ||||
| -rw-r--r-- | gui/EditTextWidget.h | 5 | ||||
| -rw-r--r-- | gui/ListWidget.cpp | 16 | ||||
| -rw-r--r-- | gui/ListWidget.h | 4 | ||||
| -rw-r--r-- | gui/dialog.cpp | 14 | ||||
| -rw-r--r-- | gui/dialog.h | 4 | ||||
| -rw-r--r-- | gui/newgui.cpp | 24 | ||||
| -rw-r--r-- | gui/newgui.h | 6 | ||||
| -rw-r--r-- | gui/widget.h | 4 | ||||
| -rw-r--r-- | scumm/dialogs.cpp | 6 | ||||
| -rw-r--r-- | scumm/dialogs.h | 8 | 
11 files changed, 52 insertions, 65 deletions
| diff --git a/gui/EditTextWidget.cpp b/gui/EditTextWidget.cpp index b10b44ce4d..e91aff4986 100644 --- a/gui/EditTextWidget.cpp +++ b/gui/EditTextWidget.cpp @@ -29,8 +29,6 @@ EditTextWidget::EditTextWidget(Dialog *boss, int x, int y, int w, int h, const S  	_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE;  	_type = kEditTextWidget; -	_currentKeyDown = 0; -  	_caretVisible = false;  	_caretTime = 0;  } @@ -54,7 +52,7 @@ void EditTextWidget::handleMouseDown(int x, int y, int button, int clickCount)  	// a mouse click should place the caret.  } -bool EditTextWidget::handleKeyDown(char key, int modifiers) +bool EditTextWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers)  {  	bool handled = true;  	bool dirty = false; @@ -63,7 +61,7 @@ bool EditTextWidget::handleKeyDown(char key, int modifiers)  	if (_caretVisible)  		drawCaret(true); -	switch (key) { +	switch (keycode) {  		case '\n':	// enter/return  		case '\r':  			_boss->releaseFocus(); @@ -87,8 +85,8 @@ bool EditTextWidget::handleKeyDown(char key, int modifiers)  		case 23:	// end  			break;  		default: -			if (isalnum(key) || key == ' ' || key == '-' || key == '_') { -				_label += key; +			if (isprint((char)ascii)) { +				_label += (char)ascii;  				dirty = true;  			} else {  				handled = false; @@ -97,26 +95,10 @@ bool EditTextWidget::handleKeyDown(char key, int modifiers)  	if (dirty)  		draw(); - -#ifndef _WIN32_WCE - -	// not done on WinCE because keyboard is emulated and -	// keyup is not generated - -	_currentKeyDown = key; - -#endif  	return handled;  } -bool EditTextWidget::handleKeyUp(char key, int modifiers) -{ -	if (key == _currentKeyDown) -		_currentKeyDown = 0; -	return true; -} -  void EditTextWidget::drawWidget(bool hilite)  {  	NewGui			*gui = _boss->getGui(); diff --git a/gui/EditTextWidget.h b/gui/EditTextWidget.h index ecc5c2fe34..9795bc1012 100644 --- a/gui/EditTextWidget.h +++ b/gui/EditTextWidget.h @@ -30,7 +30,6 @@ class EditTextWidget : public StaticTextWidget {  	typedef ScummVM::StringList StringList;  	typedef ScummVM::String String;  protected: -	int				_currentKeyDown;  	String			_backupString;  	bool			_caretVisible;  	uint32			_caretTime; @@ -39,9 +38,7 @@ public:  	virtual void handleTickle();  	virtual void handleMouseDown(int x, int y, int button, int clickCount); -	virtual bool handleKeyDown(char key, int modifiers); -	virtual bool handleKeyUp(char key, int modifiers); -	//virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); +	virtual bool handleKeyDown(uint16 ascii, int keycode, int modifiers);  	virtual bool wantsFocus() { return true; }; diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp index 9a81800b19..3a1937d0fe 100644 --- a/gui/ListWidget.cpp +++ b/gui/ListWidget.cpp @@ -136,7 +136,7 @@ void ListWidget::handleMouseWheel(int x, int y, int direction)  	_scrollBar->handleMouseWheel(x, y, direction);  } -bool ListWidget::handleKeyDown(char key, int modifiers) +bool ListWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers)  {  	bool handled = true;  	bool dirty = false; @@ -147,7 +147,7 @@ bool ListWidget::handleKeyDown(char key, int modifiers)  		if (_caretVisible)  			drawCaret(true); -		switch (key) { +		switch (keycode) {  			case '\n':	// enter/return  			case '\r':  				// enter, confirm edit and exit editmode @@ -166,8 +166,8 @@ bool ListWidget::handleKeyDown(char key, int modifiers)  				dirty = true;  				break;  			default: -				if (isalnum(key) || key == ' ' || key == '-' || key == '_') { -					_list[_selectedItem] += key; +				if (isprint((char)ascii)) { +					_list[_selectedItem] += (char)ascii;  					dirty = true;  				} else {  					handled = false; @@ -177,7 +177,7 @@ bool ListWidget::handleKeyDown(char key, int modifiers)  	} else {  		// not editmode -		switch (key) { +		switch (keycode) {  		case '\n':	// enter  		case '\r':  			if (_selectedItem >= 0) { @@ -234,16 +234,16 @@ bool ListWidget::handleKeyDown(char key, int modifiers)  	// not done on WinCE because keyboard is emulated and  	// keyup is not generated -	_currentKeyDown = key; +	_currentKeyDown = keycode;  #endif  	return handled;  } -bool ListWidget::handleKeyUp(char key, int modifiers) +bool ListWidget::handleKeyUp(uint16 ascii, int keycode, int modifiers)  { -	if (key == _currentKeyDown) +	if (keycode == _currentKeyDown)  		_currentKeyDown = 0;  	return true;  } diff --git a/gui/ListWidget.h b/gui/ListWidget.h index a378414958..1d1cb6c626 100644 --- a/gui/ListWidget.h +++ b/gui/ListWidget.h @@ -74,8 +74,8 @@ public:  	virtual void handleMouseDown(int x, int y, int button, int clickCount);  	virtual void handleMouseUp(int x, int y, int button, int clickCount);  	virtual void handleMouseWheel(int x, int y, int direction); -	virtual bool handleKeyDown(char key, int modifiers); -	virtual bool handleKeyUp(char key, int modifiers); +	virtual bool handleKeyDown(uint16 ascii, int keycode, int modifiers); +	virtual bool handleKeyUp(uint16 ascii, int keycode, int modifiers);  	virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);  	virtual bool wantsFocus() { return true; }; diff --git a/gui/dialog.cpp b/gui/dialog.cpp index d2eb689d2e..6286bbfaf9 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -188,17 +188,17 @@ void Dialog::handleMouseWheel(int x, int y, int direction)  		w->handleMouseWheel(x, y, direction);  } -void Dialog::handleKeyDown(char key, int modifiers) +void Dialog::handleKeyDown(uint16 ascii, int keycode, int modifiers)  {  	if (_focusedWidget) { -		if (_focusedWidget->handleKeyDown(key, modifiers)) +		if (_focusedWidget->handleKeyDown(ascii, keycode, modifiers))  			return;  	} else {  		// Hotkey handling  		Widget *w = _firstWidget; -		key = toupper(key); +		ascii = toupper(ascii);  		while (w) { -			if (w->_type == kButtonWidget && key == toupper(((ButtonWidget *)w)->_hotkey)) { +			if (w->_type == kButtonWidget && ascii == toupper(((ButtonWidget *)w)->_hotkey)) {  				// We first send a mouseDown then a mouseUp.  				// FIXME: insert a brief delay between both.  				w->handleMouseDown(0, 0, 1, 1); @@ -210,17 +210,17 @@ void Dialog::handleKeyDown(char key, int modifiers)  	}  	// ESC closes all dialogs by default -	if (key == 27) +	if (keycode == 27)  		close();  	// TODO: tab/shift-tab should focus the next/previous focusable widget  } -void Dialog::handleKeyUp(char key, int modifiers) +void Dialog::handleKeyUp(uint16 ascii, int keycode, int modifiers)  {  	// Focused widget recieves keyup events  	if (_focusedWidget) -		_focusedWidget->handleKeyUp(key, modifiers); +		_focusedWidget->handleKeyUp(ascii, keycode, modifiers);  }  void Dialog::handleMouseMoved(int x, int y, int button) diff --git a/gui/dialog.h b/gui/dialog.h index 2096e325e5..2468275e31 100644 --- a/gui/dialog.h +++ b/gui/dialog.h @@ -75,8 +75,8 @@ protected:  	virtual void handleMouseDown(int x, int y, int button, int clickCount);  	virtual void handleMouseUp(int x, int y, int button, int clickCount);  	virtual void handleMouseWheel(int x, int y, int direction); -	virtual void handleKeyDown(char key, int modifiers); -	virtual void handleKeyUp(char key, int modifiers); +	virtual void handleKeyDown(uint16 ascii, int keycode, int modifiers); +	virtual void handleKeyUp(uint16 ascii, int keycode, int modifiers);  	virtual void handleMouseMoved(int x, int y, int button);  	virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); diff --git a/gui/newgui.cpp b/gui/newgui.cpp index 3b30f410bc..a30be8ad10 100644 --- a/gui/newgui.cpp +++ b/gui/newgui.cpp @@ -82,7 +82,7 @@ static byte guifont[] = {  // Constructor  NewGui::NewGui(OSystem *system) : _system(system), _screen(0), _needRedraw(false), -	_stateIsSaved(false), _currentKeyDown(0), _cursorAnimateCounter(0), _cursorAnimateTimer(0) +	_stateIsSaved(false), _cursorAnimateCounter(0), _cursorAnimateTimer(0)  {  	// Setup some default GUI colors.  	// TODO - either use nicer values, or maybe make this configurable? @@ -94,6 +94,9 @@ NewGui::NewGui(OSystem *system) : _system(system), _screen(0), _needRedraw(false  	// Clear the cursor  	memset(_cursor, 0xFF, sizeof(_cursor)); +	 +	// Reset key repeat +	_currentKeyDown.keycode = 0;  }  void NewGui::runLoop() @@ -132,22 +135,23 @@ void NewGui::runLoop()  		while (_system->poll_event(&event)) {  			switch(event.event_code) {  				case OSystem::EVENT_KEYDOWN: -					activeDialog->handleKeyDown((byte)event.kbd.ascii, event.kbd.flags); +					activeDialog->handleKeyDown(event.kbd.ascii, event.kbd.keycode, event.kbd.flags);  #ifndef _WIN32_WCE  					// init continuous event stream  					// not done on WinCE because keyboard is emulated and  					// keyup is not generated -					_currentKeyDown = event.kbd.ascii; -					_currentKeyDownFlags = event.kbd.flags; +					_currentKeyDown.ascii = event.kbd.ascii; +					_currentKeyDown.keycode = event.kbd.keycode; +					_currentKeyDown.flags = event.kbd.flags;  					_keyRepeatTime = time + kKeyRepeatInitialDelay;  #endif  					break;  				case OSystem::EVENT_KEYUP: -					activeDialog->handleKeyUp((byte)event.kbd.ascii, event.kbd.flags); -					if (event.kbd.ascii == _currentKeyDown) +					activeDialog->handleKeyUp(event.kbd.ascii, event.kbd.keycode, event.kbd.flags); +					if (event.kbd.keycode == _currentKeyDown.keycode)  						// only stop firing events if it's the current key -						_currentKeyDown = 0; +						_currentKeyDown.keycode = 0;  					break;  				case OSystem::EVENT_MOUSEMOVE:  					_system->set_mouse_pos(event.mouse.x, event.mouse.y); @@ -183,12 +187,12 @@ void NewGui::runLoop()  		}  		// check if event should be sent again (keydown) -		if (_currentKeyDown != 0) +		if (_currentKeyDown.keycode != 0)  		{  			if (_keyRepeatTime < time)  			{  				// fire event -				activeDialog->handleKeyDown(_currentKeyDown, _currentKeyDownFlags); +				activeDialog->handleKeyDown(_currentKeyDown.ascii, _currentKeyDown.keycode, _currentKeyDown.flags);  				_keyRepeatTime = time + kKeyRepeatSustainDelay;  			}  		} @@ -216,7 +220,7 @@ void NewGui::saveState()  //	_screenPitch = _system->get_width();  	_system->grab_overlay(_screen, _screenPitch); -	_currentKeyDown = 0; +	_currentKeyDown.keycode = 0;  	_lastClick.x = _lastClick.y = 0;  	_lastClick.time = 0;  	_lastClick.count = 0; diff --git a/gui/newgui.h b/gui/newgui.h index 1bd68ff0a3..25c22b8147 100644 --- a/gui/newgui.h +++ b/gui/newgui.h @@ -84,7 +84,11 @@ protected:  	bool		_stateIsSaved;  	// for continuous events (keyDown) -	int			_currentKeyDown, _currentKeyDownFlags; +	struct { +		uint16 ascii; +		byte flags; +		int keycode; +	} _currentKeyDown;  	uint32		_keyRepeatTime;  	// position and time of last mouse click (used to detect double clicks) diff --git a/gui/widget.h b/gui/widget.h index aa74167f41..8330743703 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -110,8 +110,8 @@ public:  	virtual void handleMouseLeft(int button) {}  	virtual void handleMouseMoved(int x, int y, int button) {}  	virtual void handleMouseWheel(int x, int y, int direction) {} -	virtual bool handleKeyDown(char key, int modifiers) { return false; }	// Return true if the event was handled -	virtual bool handleKeyUp(char key, int modifiers) { return false; }	// Return true if the event was handled +	virtual bool handleKeyDown(uint16 ascii, int keycode, int modifiers) { return false; }	// Return true if the event was handled +	virtual bool handleKeyUp(uint16 ascii, int keycode, int modifiers) { return false; }	// Return true if the event was handled  	virtual void handleTickle() {}  	void draw();  	void receivedFocus() { _hasFocus = true; receivedFocusWidget(); } diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp index 69616a4e9d..b2a252c8f8 100644 --- a/scumm/dialogs.cpp +++ b/scumm/dialogs.cpp @@ -752,13 +752,13 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {  	}  } -void KeysDialog::handleKeyDown(char key, int modifiers) { +void KeysDialog::handleKeyDown(uint16 ascii, int keycode, int modifiers) {  	if (modifiers == 0xff  && _get_key_mapping) {  		// GAPI key was selected  		char selection[100]; -		clearActionKey(key & 0xff); -		getAction(_actionSelected)->action_key = (key & 0xff); +		clearActionKey(ascii & 0xff); +		getAction(_actionSelected)->action_key = (ascii & 0xff);  		sprintf(selection, "Associated key : %s", getGAPIKeyName((unsigned int)getAction(_actionSelected)->action_key));				  		_actionTitle->setLabel(queryCustomString(25));  		_keyMapping->setLabel(selection); diff --git a/scumm/dialogs.h b/scumm/dialogs.h index 80b5fdb480..abe21082d2 100644 --- a/scumm/dialogs.h +++ b/scumm/dialogs.h @@ -118,12 +118,12 @@ public:  	virtual void handleMouseDown(int x, int y, int button, int clickCount)  		{ close(); } -	virtual void handleKeyDown(char key, int modifiers) +	virtual void handleKeyDown(uint16 ascii, int keycode, int modifiers)  		{ -			if (key == ' ')  // Close pause dialog if space key is pressed +			if (ascii == ' ')  // Close pause dialog if space key is pressed  				close();  			else -				ScummDialog::handleKeyDown(key, modifiers); +				ScummDialog::handleKeyDown(ascii, keycode, modifiers);  		}  protected:  	void setInfoText (const String& message); @@ -141,7 +141,7 @@ public:  	KeysDialog(NewGui *gui, Scumm *scumm);  	virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); -	virtual void handleKeyDown(char key, int modifiers); +	virtual void handleKeyDown(uint16 ascii, int keycode, int modifiers);  protected: | 
