diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2015-04-17 12:06:29 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2015-04-20 07:43:39 +0000 |
commit | a91ac8d5a66396960ff37d805ecf03079ee00391 (patch) | |
tree | fa19411dfb4d8fab16ea14c33c40ff833e4190b2 /src/plugins/platforms/xcb/qxcbkeyboard.cpp | |
parent | 0495970631fc4904c485f42460a30373d32d4c25 (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.cpp | 8 |
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); } |