Windows: Fixed handling of key events containing ctrl modifier
authorOliver Wolff <oliver.wolff@digia.com>
Tue, 13 Nov 2012 06:50:43 +0000 (07:50 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 14 Nov 2012 09:36:38 +0000 (10:36 +0100)
QKeyEvent::key() returned the wrong value if the ctrl modifier was used
in that key event. That was due to the fact that ToUnicode might not
return the correct code for these events/keyboard states. While it works
for alt+shift+= (us layout) and gives '+' as unicode value it just
claims that it cannot translate the given state for ctrl+shift+=. So if
the control modifier is used and ToUnicode return 0 toKeyOrUnicode
should try again without the control modifier.

Task-number: QTBUG-10781

Change-Id: I5eb9c200701b4c98a8089fc0ab1ebaa385dbeea8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
src/plugins/platforms/windows/qwindowskeymapper.cpp

index 993a8d4..5a11aee 100644 (file)
@@ -481,6 +481,14 @@ static inline int toKeyOrUnicode(int vk, int scancode, unsigned char *kbdBuffer,
     int code = 0;
     QChar unicodeBuffer[5];
     int res = ToUnicode(vk, scancode, kbdBuffer, reinterpret_cast<LPWSTR>(unicodeBuffer), 5, 0);
+    // When Ctrl modifier is used ToUnicode does not return correct values. In order to assign the
+    // right key the control modifier is removed for just that function if the previous call failed.
+    if (res == 0 && kbdBuffer[VK_CONTROL]) {
+        const unsigned char controlState = kbdBuffer[VK_CONTROL];
+        kbdBuffer[VK_CONTROL] = 0;
+        res = ToUnicode(vk, scancode, kbdBuffer, reinterpret_cast<LPWSTR>(unicodeBuffer), 5, 0);
+        kbdBuffer[VK_CONTROL] = controlState;
+    }
     if (res)
         code = unicodeBuffer[0].toUpper().unicode();