aboutsummaryrefslogtreecommitdiff
path: root/backends/common/virtual-keyboard.cpp
diff options
context:
space:
mode:
authorStephen Kennedy2008-07-26 20:35:46 +0000
committerStephen Kennedy2008-07-26 20:35:46 +0000
commit6e48d5c76d829a0439f06ed8ca92dc9887b3be23 (patch)
tree2d487a7dae55459f18bb5ad0a9cd563a12360309 /backends/common/virtual-keyboard.cpp
parentdfcdbb0d335128c99d13ba017a4e36f2338f7736 (diff)
downloadscummvm-rg350-6e48d5c76d829a0439f06ed8ca92dc9887b3be23.tar.gz
scummvm-rg350-6e48d5c76d829a0439f06ed8ca92dc9887b3be23.tar.bz2
scummvm-rg350-6e48d5c76d829a0439f06ed8ca92dc9887b3be23.zip
VirtualKeyboard:
- implemented functionality for modifier keys - cleaned up parser - started on text display svn-id: r33317
Diffstat (limited to 'backends/common/virtual-keyboard.cpp')
-rw-r--r--backends/common/virtual-keyboard.cpp106
1 files changed, 103 insertions, 3 deletions
diff --git a/backends/common/virtual-keyboard.cpp b/backends/common/virtual-keyboard.cpp
index 0a061df545..e6ef87b946 100644
--- a/backends/common/virtual-keyboard.cpp
+++ b/backends/common/virtual-keyboard.cpp
@@ -63,6 +63,7 @@ void VirtualKeyboard::reset() {
_vAlignment = kAlignBottom;
_keyQueue.clear();
_keyDown = 0;
+ _keyFlags = 0;
_displaying = _drag = false;
_firstRun = true;
_lastScreenChanged = _system->getScreenChangeID();
@@ -196,13 +197,23 @@ void VirtualKeyboard::processClick(const Common::String& area) {
Event evt = _currentMode->events[area];
switch (evt.type) {
- case kEventKey:
+ case kEventKey: {
// add virtual keypress to queue
- _keyQueue.push(*(Common::KeyState*)evt.data);
+ Common::KeyState key = *(Common::KeyState*)evt.data;
+ key.flags ^= _keyFlags;
+ if ((key.keycode >= Common::KEYCODE_a) && (key.keycode <= Common::KEYCODE_z))
+ key.ascii = (key.flags & Common::KBD_SHIFT) ? key.keycode - 32 : key.keycode;
+ _keyQueue.insertKey(key);
+ _keyFlags = 0;
+ break;
+ }
+ case kEventModifier:
+ _keyFlags ^= *(byte*)(evt.data);
break;
case kEventSwitchMode:
// switch to new mode
switchMode(*(Common::String *)evt.data);
+ _keyFlags = 0;
break;
case kEventClose:
// close virtual keyboard
@@ -247,7 +258,6 @@ void VirtualKeyboard::show() {
_system->showOverlay();
_system->clearOverlay();
}
-
_overlayBackup.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor));
_system->grabOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w);
setupCursor();
@@ -382,4 +392,94 @@ void VirtualKeyboard::removeCursor() {
CursorMan.popCursorPalette();
}
+VirtualKeyboard::Queue::Queue() {
+ _keyPos = _keys.begin();
+ _strPos = 0;
+}
+
+void VirtualKeyboard::Queue::insertKey(KeyState key) {
+ switch (key.keycode) {
+ case KEYCODE_LEFT:
+ moveLeft();
+ return;
+ case KEYCODE_RIGHT:
+ moveRight();
+ return;
+ case KEYCODE_BACKSPACE:
+ deleteKey();
+ return;
+ }
+
+ String keyStr;
+ if (key.keycode >= 32 && key.keycode <= 126) {
+ if (key.flags & KBD_CTRL)
+ keyStr += "Ctrl+";
+ if (key.flags & KBD_ALT)
+ keyStr += "Alt+";
+ if (key.flags & KBD_SHIFT && (key.ascii < 65 || key.ascii > 90))
+ keyStr += "Shift+";
+ keyStr += (char)key.ascii;
+ }
+
+ const char *k = keyStr.c_str();
+ while (char ch = *k++)
+ _str.insertChar(ch, _strPos++);
+
+ VirtualKeyPress kp;
+ kp.key = key;
+ kp.strLen = keyStr.size();
+ _keys.insert(_keyPos, kp);
+ _keyPos++;
+}
+
+void VirtualKeyboard::Queue::deleteKey() {
+ if (_keyPos == _keys.begin())
+ return;
+ List<VirtualKeyPress>::iterator it = _keyPos;
+ it--;
+ _strPos -= it->strLen;
+ while((it->strLen)-- > 0)
+ _str.deleteChar(_strPos);
+ _keys.erase(it);
+}
+
+void VirtualKeyboard::Queue::moveLeft() {
+ if (_keyPos == _keys.begin())
+ return;
+ _keyPos--;
+ _strPos -= _keyPos->strLen;
+}
+
+void VirtualKeyboard::Queue::moveRight() {
+ List<VirtualKeyPress>::iterator it = _keyPos;
+ it++;
+ if (it == _keys.end())
+ return;
+ _strPos += _keyPos->strLen;
+ _keyPos = it;
+}
+
+KeyState VirtualKeyboard::Queue::pop() {
+ KeyState ret = _keys.begin()->key;
+ _keys.pop_front();
+ return ret;
+}
+
+void VirtualKeyboard::Queue::clear() {
+ _keys.clear();
+ _keyPos = _keys.begin();
+ _str.clear();
+ _strPos = 0;
+}
+
+bool VirtualKeyboard::Queue::empty()
+{
+ return _keys.empty();
+}
+
+String VirtualKeyboard::Queue::getString()
+{
+ return _str;
+}
+
} // end of namespace Common