From a54c3bf8c046470057956354f0f3540d178515a2 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 2 Sep 2016 16:23:46 -0700 Subject: [PATCH] support for backspace, carriage return, space and period. --- interface/resources/qml/controls/Keyboard.qml | 54 ++++++++++++++++++- .../src/RenderableWebEntityItem.cpp | 34 +++++++++++- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/controls/Keyboard.qml b/interface/resources/qml/controls/Keyboard.qml index 9b1cb0e277..4bd5bd2ece 100644 --- a/interface/resources/qml/controls/Keyboard.qml +++ b/interface/resources/qml/controls/Keyboard.qml @@ -147,7 +147,13 @@ Item { width: 480 height: 50 anchors.left: parent.left - anchors.leftMargin: 79 + anchors.leftMargin: 0 + + Key { + id: key27 + width: 79 + glyph: "⇪" + } Key { id: key20 @@ -183,12 +189,45 @@ Item { id: key26 glyph: "m" } + + Key { + id: key28 + width: 85 + glyph: "←" + } + } Row { id: row4 width: 480 height: 50 + anchors.left: parent.left + anchors.leftMargin: 59 + + Key { + id: key30 + width: 45 + glyph: "⁂" + } + + Key { + id: key29 + width: 200 + glyph: " " + } + + Key { + id: key31 + glyph: "." + } + + Key { + id: key32 + width: 65 + glyph: "⏎" + } + } } } @@ -206,4 +245,17 @@ Item { anchors.bottomMargin: 0 } + Rectangle { + id: rectangle1 + color: "#ffffff" + anchors.bottom: keyboardRect.top + anchors.bottomMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.top: parent.top + anchors.topMargin: 0 + } + } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index e3c5dac2c0..568bf7c787 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -353,10 +353,40 @@ bool RenderableWebEntityItem::isTransparent() { return fadeRatio < OPAQUE_ALPHA_THRESHOLD; } +// UTF-8 encoded symbols +static const uint8_t UPWARDS_WHITE_ARROW_FROM_BAR[] = { 0xE2, 0x87, 0xAA, 0x00 }; // shift +static const uint8_t ERASE_TO_THE_LEFT[] = { 0xE2, 0x8C, 0xAB, 0x00 }; // backspace +static const uint8_t LONG_LEFTWARDS_ARROW[] = { 0xE2, 0x9F, 0xB5, 0x00 }; // backspace +static const uint8_t LEFT_ARROW[] = { 0xE2, 0x86, 0x90 }; // backspace +static const uint8_t ASTERISIM[] = { 0xE2, 0x81, 0x82, 0x00 }; // symbols +static const uint8_t RETURN_SYMBOL[] = { 0xE2, 0x8F, 0x8E, 0x00 }; // return + +static bool equals(const QByteArray& byteArray, const uint8_t* ptr) { + for (int i = 0; i < byteArray.size(); i++) { + if ((char)ptr[i] != byteArray[i]) { + return false; + } + } + return true; +} + void RenderableWebEntityItem::synthesizeKeyPress(QString key) { auto utf8Key = key.toUtf8(); - QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, (int)utf8Key[0], Qt::NoModifier, key); - QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, (int)utf8Key[0], Qt::NoModifier, key); + + int scanCode = (int)utf8Key[0]; + QString keyString = key; + if (equals(utf8Key, UPWARDS_WHITE_ARROW_FROM_BAR) || equals(utf8Key, ASTERISIM)) { + return; // ignore + } else if (equals(utf8Key, ERASE_TO_THE_LEFT) || equals(utf8Key, LONG_LEFTWARDS_ARROW) | equals(utf8Key, LEFT_ARROW)) { + scanCode = Qt::Key_Backspace; + keyString = "\x08"; + } else if (equals(utf8Key, RETURN_SYMBOL)) { + scanCode = Qt::Key_Return; + keyString = "\x0d"; + } + + QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, scanCode, Qt::NoModifier, keyString); + QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, scanCode, Qt::NoModifier, keyString); QCoreApplication::postEvent(getEventHandler(), pressEvent); QCoreApplication::postEvent(getEventHandler(), releaseEvent); }