From 09d27083f5e1e6cd155a9eab9ffeb71fc2d0d2f7 Mon Sep 17 00:00:00 2001 From: Ryan Norton Date: Thu, 21 Apr 2005 09:22:17 +0000 Subject: [PATCH] Fix shift and other keys with wxGetKeyState on mac git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33798 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/corefoundation/hid.cpp | 67 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/src/mac/corefoundation/hid.cpp b/src/mac/corefoundation/hid.cpp index f3e2f93..d824a0a 100644 --- a/src/mac/corefoundation/hid.cpp +++ b/src/mac/corefoundation/hid.cpp @@ -294,6 +294,12 @@ bool wxHIDDevice::IsActive(int nIndex) wxASSERT(m_pCookies[nIndex] != NULL); IOHIDEventStruct Event; (*m_ppDevice)->getElementValue(m_ppDevice, m_pCookies[nIndex], &Event); +/* + wxString ss; + ss << _T("[") << (int) m_pCookies[nIndex] << _T("] = ") << Event.value << _T(" SIZE:") << Event.longValueSize; + + wxLogDebug(ss); +*/ return !!Event.value; } @@ -347,12 +353,46 @@ void wxHIDKeyboard::BuildCookies(wxCFArray& Array) InitCookies(500); int i, nUsage; + bool bEOTriggered = false; for (i = 0; i < Array.Count(); ++i) - { + { CFNumberGetValue( (CFNumberRef) CFDictionaryGetValue((CFDictionaryRef) Array[i], CFSTR(kIOHIDElementUsageKey)), kCFNumberLongType, &nUsage); - + + // + // OK, this is strange - basically this kind of strange - + // Starting from 0xEO these elements (like shift) appear twice in + // the array! The ones at the end are bogus I guess - the funny part + // is that besides the fact that the ones at the front have a Unit + // and UnitExponent key with a value of 0 and a different cookie value, + // there is no discernable difference between the two... + // + // Will the real shift please stand up? + // + // Something to spend a support request on, if I had one, LOL. + // + if(nUsage == 0xE0) + { + if(bEOTriggered) + break; + bEOTriggered = true; + } +/* + wxString msg; + int cookie; + CFNumberGetValue( + (CFNumberRef) CFDictionaryGetValue ( (CFDictionaryRef) Array[i] + , CFSTR(kIOHIDElementCookieKey) + ), + kCFNumberIntType, + &cookie + ); + + msg << wxT("KEY:") << nUsage << wxT("COOKIE:") << cookie; + wxLogDebug(msg); +*/ + if (nUsage >= kHIDUsage_KeyboardA && nUsage <= kHIDUsage_KeyboardZ) AddCookie(Array[i], 'A' + (nUsage - kHIDUsage_KeyboardA) ); else if (nUsage >= kHIDUsage_Keyboard1 && nUsage <= kHIDUsage_Keyboard9) @@ -504,7 +544,28 @@ bool wxGetKeyState (wxKeyCode key) } } - return wxHIDModule::sm_keyboard->IsActive(key); + switch(key) + { + case WXK_SHIFT: + return wxHIDModule::sm_keyboard->IsActive(WXK_SHIFT) || + wxHIDModule::sm_keyboard->IsActive(WXK_RSHIFT); + break; + case WXK_ALT: + return wxHIDModule::sm_keyboard->IsActive(WXK_ALT) || + wxHIDModule::sm_keyboard->IsActive(WXK_RALT); + break; + case WXK_CONTROL: + return wxHIDModule::sm_keyboard->IsActive(WXK_CONTROL) || + wxHIDModule::sm_keyboard->IsActive(WXK_RCONTROL); + break; + case WXK_MENU: + return wxHIDModule::sm_keyboard->IsActive(WXK_MENU) || + wxHIDModule::sm_keyboard->IsActive(WXK_RMENU); + break; + default: + return wxHIDModule::sm_keyboard->IsActive(key); + break; + } } #endif //__DARWIN__ -- 2.7.4