aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorYotam Barnoy2010-02-21 04:04:13 +0000
committerYotam Barnoy2010-02-21 04:04:13 +0000
commitef330ed9b4e5d6252134ed137b042593f79d02a9 (patch)
tree919c4ae91efca10102936a1833251b48323b8983 /gui
parentcebb052e2cfd963b95d7357b7c21dc8c437e058a (diff)
downloadscummvm-rg350-ef330ed9b4e5d6252134ed137b042593f79d02a9.tar.gz
scummvm-rg350-ef330ed9b4e5d6252134ed137b042593f79d02a9.tar.bz2
scummvm-rg350-ef330ed9b4e5d6252134ed137b042593f79d02a9.zip
Patch for bug 2943361 by littleboy, adding full kb modifier support to all engines + GUI and proper keypad handling
svn-id: r48101
Diffstat (limited to 'gui')
-rw-r--r--gui/ListWidget.cpp72
-rw-r--r--gui/PopUpWidget.cpp30
-rw-r--r--gui/console.cpp160
-rw-r--r--gui/console.h2
-rw-r--r--gui/editable.cpp79
-rw-r--r--gui/editable.h2
6 files changed, 272 insertions, 73 deletions
diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp
index fb6d7de2c5..baaa29aecb 100644
--- a/gui/ListWidget.cpp
+++ b/gui/ListWidget.cpp
@@ -286,7 +286,7 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
bool dirty = false;
int oldSelectedItem = _selectedItem;
- if (!_editMode && isprint((unsigned char)state.ascii)) {
+ if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) {
// Quick selection mode: Go to first list item starting with this key
// (or a substring accumulated from the last couple key presses).
// Only works in a useful fashion if the list entries are sorted.
@@ -339,8 +339,18 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
sendCommand(kListItemActivatedCmd, _selectedItem);
}
break;
- case Common::KEYCODE_BACKSPACE:
+
+ // Keypad & special keys
+ // - if num lock is set, we do not handle the keypress
+ // - if num lock is not set, we either fall down to the special key case
+ // or ignore the key press for 0, 4, 5 and 6
+
case Common::KEYCODE_KP_PERIOD:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
+ case Common::KEYCODE_BACKSPACE:
case Common::KEYCODE_DELETE:
if (_selectedItem >= 0) {
if (_editable) {
@@ -350,30 +360,68 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
}
}
break;
- case Common::KEYCODE_UP:
- if (_selectedItem > 0)
- _selectedItem--;
+
+ case Common::KEYCODE_KP1:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
+ case Common::KEYCODE_END:
+ _selectedItem = _list.size() - 1;
break;
+
+
+ case Common::KEYCODE_KP2:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
case Common::KEYCODE_DOWN:
if (_selectedItem < (int)_list.size() - 1)
_selectedItem++;
break;
- case Common::KEYCODE_PAGEUP:
- _selectedItem -= _entriesPerPage - 1;
- if (_selectedItem < 0)
- _selectedItem = 0;
- break;
+
+ case Common::KEYCODE_KP3:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
case Common::KEYCODE_PAGEDOWN:
_selectedItem += _entriesPerPage - 1;
if (_selectedItem >= (int)_list.size() )
_selectedItem = _list.size() - 1;
break;
+
+ case Common::KEYCODE_KP7:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
case Common::KEYCODE_HOME:
_selectedItem = 0;
break;
- case Common::KEYCODE_END:
- _selectedItem = _list.size() - 1;
+
+ case Common::KEYCODE_KP8:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
+ case Common::KEYCODE_UP:
+ if (_selectedItem > 0)
+ _selectedItem--;
break;
+
+ case Common::KEYCODE_KP9:
+ if (state.flags & Common::KBD_NUM) {
+ handled = false;
+ break;
+ }
+ case Common::KEYCODE_PAGEUP:
+ _selectedItem -= _entriesPerPage - 1;
+ if (_selectedItem < 0)
+ _selectedItem = 0;
+ break;
+
default:
handled = false;
}
diff --git a/gui/PopUpWidget.cpp b/gui/PopUpWidget.cpp
index 35cfaf6d4a..d0828a69f6 100644
--- a/gui/PopUpWidget.cpp
+++ b/gui/PopUpWidget.cpp
@@ -222,23 +222,45 @@ void PopUpDialog::handleKeyDown(Common::KeyState state) {
return;
switch (state.keycode) {
+
case Common::KEYCODE_RETURN:
case Common::KEYCODE_KP_ENTER:
setResult(_selection);
close();
break;
- case Common::KEYCODE_UP:
- moveUp();
+
+ // Keypad & special keys
+ // - if num lock is set, we ignore the keypress
+ // - if num lock is not set, we fall down to the special key case
+
+ case Common::KEYCODE_KP1:
+ if (state.flags & Common::KBD_NUM)
+ break;
+ case Common::KEYCODE_END:
+ setSelection(_popUpBoss->_entries.size()-1);
break;
+
+ case Common::KEYCODE_KP2:
+ if (state.flags & Common::KBD_NUM)
+ break;
case Common::KEYCODE_DOWN:
moveDown();
break;
+
+ case Common::KEYCODE_KP7:
+ if (state.flags & Common::KBD_NUM)
+ break;
case Common::KEYCODE_HOME:
setSelection(0);
break;
- case Common::KEYCODE_END:
- setSelection(_popUpBoss->_entries.size()-1);
+
+ case Common::KEYCODE_KP8:
+ if (state.flags & Common::KBD_NUM)
+ break;
+ case Common::KEYCODE_UP:
+ moveUp();
break;
+
default:
break;
}
diff --git a/gui/console.cpp b/gui/console.cpp
index 1316b59241..37d3bd6aa5 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -302,9 +302,11 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
slideUpAndClose();
break;
}
+
case Common::KEYCODE_ESCAPE:
slideUpAndClose();
break;
+
case Common::KEYCODE_BACKSPACE:
if (_caretVisible)
drawCaret(true);
@@ -316,8 +318,8 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
scrollToCurrent();
drawLine(pos2line(_currentPos));
break;
- case Common::KEYCODE_TAB:
- {
+
+ case Common::KEYCODE_TAB: {
if (_completionCallbackProc) {
int len = _currentPos - _promptStartPos;
assert(len >= 0);
@@ -339,24 +341,64 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
delete[] str;
}
break;
- }
+ }
+
+ // Keypad & special keys
+ // - if num lock is set, we always go to the default case
+ // - if num lock is not set, we either fall down to the special key case
+ // or ignore the key press in case of 0 (INSERT) or 5
+
+ case Common::KEYCODE_KP0:
+ case Common::KEYCODE_KP5:
+ if (state.flags & Common::KBD_NUM)
+ defaultKeyDownHandler(state);
+ break;
+
+ case Common::KEYCODE_KP_PERIOD:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
case Common::KEYCODE_DELETE:
if (_currentPos < _promptEndPos) {
killChar();
drawLine(pos2line(_currentPos));
}
break;
- case Common::KEYCODE_PAGEUP:
- if (state.flags == Common::KBD_SHIFT) {
- _scrollLine -= _linesPerPage - 1;
- if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1)
- _scrollLine = _firstLineInBuffer + _linesPerPage - 1;
+
+ case Common::KEYCODE_KP1:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
+ case Common::KEYCODE_END:
+ if (state.hasFlags(Common::KBD_SHIFT)) {
+ _scrollLine = _promptEndPos / kCharsPerLine;
+ if (_scrollLine < _linesPerPage - 1)
+ _scrollLine = _linesPerPage - 1;
updateScrollBuffer();
- draw();
+ } else {
+ _currentPos = _promptEndPos;
}
+ draw();
break;
+
+ case Common::KEYCODE_KP2:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
+ case Common::KEYCODE_DOWN:
+ historyScroll(-1);
+ break;
+
+ case Common::KEYCODE_KP3:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
case Common::KEYCODE_PAGEDOWN:
- if (state.flags == Common::KBD_SHIFT) {
+ if (state.hasFlags(Common::KBD_SHIFT)) {
_scrollLine += _linesPerPage - 1;
if (_scrollLine > _promptEndPos / kCharsPerLine) {
_scrollLine = _promptEndPos / kCharsPerLine;
@@ -367,8 +409,36 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
draw();
}
break;
+
+ case Common::KEYCODE_KP4:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
+ case Common::KEYCODE_LEFT:
+ if (_currentPos > _promptStartPos)
+ _currentPos--;
+ drawLine(pos2line(_currentPos));
+ break;
+
+ case Common::KEYCODE_KP6:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
+ case Common::KEYCODE_RIGHT:
+ if (_currentPos < _promptEndPos)
+ _currentPos++;
+ drawLine(pos2line(_currentPos));
+ break;
+
+ case Common::KEYCODE_KP7:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
case Common::KEYCODE_HOME:
- if (state.flags == Common::KBD_SHIFT) {
+ if (state.hasFlags(Common::KBD_SHIFT)) {
_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
updateScrollBuffer();
} else {
@@ -376,45 +446,47 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
}
draw();
break;
- case Common::KEYCODE_END:
- if (state.flags == Common::KBD_SHIFT) {
- _scrollLine = _promptEndPos / kCharsPerLine;
- if (_scrollLine < _linesPerPage - 1)
- _scrollLine = _linesPerPage - 1;
- updateScrollBuffer();
- } else {
- _currentPos = _promptEndPos;
+
+ case Common::KEYCODE_KP8:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
}
- draw();
- break;
case Common::KEYCODE_UP:
historyScroll(+1);
break;
- case Common::KEYCODE_DOWN:
- historyScroll(-1);
- break;
- case Common::KEYCODE_RIGHT:
- if (_currentPos < _promptEndPos)
- _currentPos++;
- drawLine(pos2line(_currentPos));
- break;
- case Common::KEYCODE_LEFT:
- if (_currentPos > _promptStartPos)
- _currentPos--;
- drawLine(pos2line(_currentPos));
+
+ case Common::KEYCODE_KP9:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state);
+ break;
+ }
+ case Common::KEYCODE_PAGEUP:
+ if (state.hasFlags(Common::KBD_SHIFT)) {
+ _scrollLine -= _linesPerPage - 1;
+ if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1)
+ _scrollLine = _firstLineInBuffer + _linesPerPage - 1;
+ updateScrollBuffer();
+ draw();
+ }
break;
+
default:
- if (state.ascii == '~' || state.ascii == '#') {
- slideUpAndClose();
- } else if (state.flags == Common::KBD_CTRL) {
- specialKeys(state.keycode);
- } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
- for (i = _promptEndPos - 1; i >= _currentPos; i--)
- buffer(i + 1) = buffer(i);
- _promptEndPos++;
- putchar((byte)state.ascii);
- scrollToCurrent();
- }
+ defaultKeyDownHandler(state);
+ }
+}
+
+void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) {
+ if (state.ascii == '~' || state.ascii == '#') {
+ slideUpAndClose();
+ } else if (state.hasFlags(Common::KBD_CTRL)) {
+ specialKeys(state.keycode);
+ } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
+ for (int i = _promptEndPos - 1; i >= _currentPos; i--)
+ buffer(i + 1) = buffer(i);
+ _promptEndPos++;
+ putchar((byte)state.ascii);
+ scrollToCurrent();
}
}
diff --git a/gui/console.h b/gui/console.h
index 52c3394184..bf44bdbe17 100644
--- a/gui/console.h
+++ b/gui/console.h
@@ -178,6 +178,8 @@ protected:
void updateScrollBuffer();
void scrollToCurrent();
+ void defaultKeyDownHandler(Common::KeyState &state);
+
// Line editing
void specialKeys(int keycode);
void nextLine();
diff --git a/gui/editable.cpp b/gui/editable.cpp
index 232873ffe3..aa95588da9 100644
--- a/gui/editable.cpp
+++ b/gui/editable.cpp
@@ -100,10 +100,12 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
endEditMode();
dirty = true;
break;
+
case Common::KEYCODE_ESCAPE:
abortEditMode();
dirty = true;
break;
+
case Common::KEYCODE_BACKSPACE:
if (_caretPos > 0) {
_caretPos--;
@@ -114,6 +116,28 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
}
forcecaret = true;
break;
+
+ // Keypad & special keys
+ // - if num lock is set, we always go to the default case
+ // - if num lock is not set, we either fall down to the special key case
+ // or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN)
+ // 5, 8 (UP) and 9 (PGUP)
+
+ case Common::KEYCODE_KP0:
+ case Common::KEYCODE_KP2:
+ case Common::KEYCODE_KP3:
+ case Common::KEYCODE_KP5:
+ case Common::KEYCODE_KP8:
+ case Common::KEYCODE_KP9:
+ if (state.flags & Common::KBD_NUM)
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+
+ case Common::KEYCODE_KP_PERIOD:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
case Common::KEYCODE_DELETE:
if (_caretPos < (int)_editString.size()) {
_editString.deleteChar(_caretPos);
@@ -123,6 +147,22 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
}
forcecaret = true;
break;
+
+ case Common::KEYCODE_KP1:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
+ case Common::KEYCODE_END:
+ dirty = setCaretPos(_editString.size());
+ forcecaret = true;
+ break;
+
+ case Common::KEYCODE_KP4:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
case Common::KEYCODE_LEFT:
if (_caretPos > 0) {
dirty = setCaretPos(_caretPos - 1);
@@ -130,6 +170,12 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
forcecaret = true;
dirty = true;
break;
+
+ case Common::KEYCODE_KP6:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
case Common::KEYCODE_RIGHT:
if (_caretPos < (int)_editString.size()) {
dirty = setCaretPos(_caretPos + 1);
@@ -137,24 +183,19 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
forcecaret = true;
dirty = true;
break;
+
+ case Common::KEYCODE_KP7:
+ if (state.flags & Common::KBD_NUM) {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ break;
+ }
case Common::KEYCODE_HOME:
dirty = setCaretPos(0);
forcecaret = true;
break;
- case Common::KEYCODE_END:
- dirty = setCaretPos(_editString.size());
- forcecaret = true;
- break;
- default:
- if (tryInsertChar((byte)state.ascii, _caretPos)) {
- _caretPos++;
- dirty = true;
- forcecaret = true;
- sendCommand(_cmd, 0);
- } else {
- handled = false;
- }
+ default:
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
}
if (dirty)
@@ -166,6 +207,18 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
return handled;
}
+void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) {
+ if (tryInsertChar((byte)state.ascii, _caretPos)) {
+ _caretPos++;
+ dirty = true;
+ forcecaret = true;
+
+ sendCommand(_cmd, 0);
+ } else {
+ handled = false;
+ }
+}
+
int EditableWidget::getCaretOffset() const {
int caretpos = 0;
for (int i = 0; i < _caretPos; i++)
diff --git a/gui/editable.h b/gui/editable.h
index 363ba7b9f6..00cb3431a5 100644
--- a/gui/editable.h
+++ b/gui/editable.h
@@ -81,6 +81,8 @@ protected:
bool adjustOffset();
void makeCaretVisible();
+ void defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled);
+
void setFontStyle(ThemeEngine::FontStyle font) { _font = font; }
virtual bool tryInsertChar(byte c, int pos);