summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbkeyboard.cpp
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2015-04-17 12:06:29 +0200
committerMarc Mutz <marc.mutz@kdab.com>2015-04-20 07:43:39 +0000
commita91ac8d5a66396960ff37d805ecf03079ee00391 (patch)
treefa19411dfb4d8fab16ea14c33c40ff833e4190b2 /src/plugins/platforms/xcb/qxcbkeyboard.cpp
parent0495970631fc4904c485f42460a30373d32d4c25 (diff)
Optimize QXcbKeyboard::lookupString.
For the common case of strings smaller than 32 chars this removes a temporary QByteArray allocation and the second call to xkb_state_key_get_utf8. Change-Id: I81cbbf2df683476b38c2ffb96119293cd5b09a90 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbkeyboard.cpp')
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 3b356525e3..6c80c1b30e 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -1515,10 +1515,12 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
QString QXcbKeyboard::lookupString(struct xkb_state *state, xcb_keycode_t code) const
{
- QByteArray chars;
- chars.resize(1 + xkb_state_key_get_utf8(state, code, 0, 0));
- // equivalent of XLookupString
+ QVarLengthArray<char, 32> chars(32);
const int size = xkb_state_key_get_utf8(state, code, chars.data(), chars.size());
+ if (Q_UNLIKELY(size + 1 > chars.size())) { // +1 for NUL
+ chars.resize(size + 1);
+ xkb_state_key_get_utf8(state, code, chars.data(), chars.size());
+ }
return QString::fromUtf8(chars.constData(), size);
}