diff options
author | Yotam Barnoy | 2010-02-21 04:04:13 +0000 |
---|---|---|
committer | Yotam Barnoy | 2010-02-21 04:04:13 +0000 |
commit | ef330ed9b4e5d6252134ed137b042593f79d02a9 (patch) | |
tree | 919c4ae91efca10102936a1833251b48323b8983 /gui | |
parent | cebb052e2cfd963b95d7357b7c21dc8c437e058a (diff) | |
download | scummvm-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.cpp | 72 | ||||
-rw-r--r-- | gui/PopUpWidget.cpp | 30 | ||||
-rw-r--r-- | gui/console.cpp | 160 | ||||
-rw-r--r-- | gui/console.h | 2 | ||||
-rw-r--r-- | gui/editable.cpp | 79 | ||||
-rw-r--r-- | gui/editable.h | 2 |
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); |