diff --git a/include/osgProducer/EventAdapter b/include/osgProducer/EventAdapter index 0fb1487aa..c37cdbc10 100644 --- a/include/osgProducer/EventAdapter +++ b/include/osgProducer/EventAdapter @@ -127,6 +127,11 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter static int _s_my; static int _s_modKeyMask; + typedef std::map KeySymbolMap; + static KeySymbolMap s_keySymbolMap; + static bool s_keySymbolMapInitialized; + + bool initKeySymbolMap(); int adaptKeySymbol(Producer::KeySymbol key); }; diff --git a/src/osgProducer/EventAdapter.cpp b/src/osgProducer/EventAdapter.cpp index 4aa7d5781..384ddbd02 100644 --- a/src/osgProducer/EventAdapter.cpp +++ b/src/osgProducer/EventAdapter.cpp @@ -14,11 +14,15 @@ int EventAdapter::_s_Ymax = 1024; int EventAdapter::_s_mx = 0; int EventAdapter::_s_my = 0; +EventAdapter::KeySymbolMap EventAdapter::s_keySymbolMap; +bool EventAdapter::s_keySymbolMapInitialized = false; + static float s_xOffset=1.0f; static float s_xScale=0.5f; static float s_yOffset=1.0f; static float s_yScale=0.5f; + EventAdapter::EventAdapter() { _eventType = NONE; // adaptor does not encapsulate any events. @@ -183,17 +187,135 @@ void EventAdapter::adaptFrame(double time) copyStaticVariables(); } -int EventAdapter::adaptKeySymbol(Producer::KeySymbol key) +bool EventAdapter::initKeySymbolMap() { - #ifdef WIN32 - // need to implement some kind of mapping, perhaps using an std::map? - if (key==VK_ESCAPE) return KEY_Escape; - return key; - - #else - // assume Producer is working under X11, so we have a 1:1 mapping - // between X11 key symbols and osgGA::GUIEventAdapter::KeySymbols. - return key; - #endif +#ifdef WIN32 + +/* + // not mapped yet as I can't see an + // obvious mapping to X11/osgGA::GUIEventAdapter::KeySymbol. + s_keySymbolMap[VK_CAPITAL] = ; + s_keySymbolMap[VK_CONVERT] = ; + s_keySymbolMap[VK_NONCONVERT] = ; + s_keySymbolMap[VK_ACCEPT] = ; + s_keySymbolMap[VK_SNAPSHOT] = ; + + s_keySymbolMap[VK_LWIN] = ; + s_keySymbolMap[VK_RWIN] = ; + s_keySymbolMap[VK_APPS] = ; + + s_keySymbolMap[VK_ATTN] = ; + s_keySymbolMap[VK_CRSEL] = ; + s_keySymbolMap[VK_EXSEL] = ; + s_keySymbolMap[VK_EREOF] = ; + s_keySymbolMap[VK_PLAY] = ; + s_keySymbolMap[VK_ZOOM] = ; + s_keySymbolMap[VK_NONAME] = ; + s_keySymbolMap[VK_PA1] = ; +*/ + + // mapped to osgGA::GUIEventAdapter::KeySymbol + s_keySymbolMap[VK_CANCEL] = KEY_Cancel; + + s_keySymbolMap[VK_BACK] = KEY_BackSpace; + s_keySymbolMap[VK_TAB] = KEY_Tab; + + s_keySymbolMap[VK_CLEAR] = KEY_Clear; + s_keySymbolMap[VK_RETURN] = KEY_Return; + + s_keySymbolMap[VK_SHIFT] = KEY_Shift_Lock; + s_keySymbolMap[VK_CONTROL] = KEY_Control_L; + s_keySymbolMap[VK_MENU] = KEY_Menu; + s_keySymbolMap[VK_PAUSE ] = KEY_Pause; + + s_keySymbolMap[VK_ESCAPE] = KEY_Escape; + + s_keySymbolMap[VK_MODECHANGE] = KEY_Mode_switch; + + s_keySymbolMap[VK_SPACE] = 0x20 + s_keySymbolMap[VK_PRIOR] = KEY_Prior; + s_keySymbolMap[VK_NEXT] = KEY_Next; + s_keySymbolMap[VK_END] = KEY_End; + s_keySymbolMap[VK_HOME] = KEY_Home; + s_keySymbolMap[VK_LEFT] = KEY_Left; + s_keySymbolMap[VK_UP] = KEY_Up; + s_keySymbolMap[VK_RIGHT] = KEY_Right; + s_keySymbolMap[VK_DOWN] = KEY_Down; + s_keySymbolMap[VK_SELECT] = KEY_Select; + s_keySymbolMap[VK_PRINT] = KEY_Print; + s_keySymbolMap[VK_EXECUTE] = KEY_Execute; + s_keySymbolMap[VK_INSERT] = KEY_Insert; + s_keySymbolMap[VK_DELETE] = KEY_Delete; + s_keySymbolMap[VK_HELP] = KEY_Help; + + s_keySymbolMap[VK_NUMPAD0] = KEY_KP_0; + s_keySymbolMap[VK_NUMPAD1] = KEY_KP_1; + s_keySymbolMap[VK_NUMPAD2] = KEY_KP_2; + s_keySymbolMap[VK_NUMPAD3] = KEY_KP_3; + s_keySymbolMap[VK_NUMPAD4] = KEY_KP_4; + s_keySymbolMap[VK_NUMPAD5] = KEY_KP_5; + s_keySymbolMap[VK_NUMPAD6] = KEY_KP_6; + s_keySymbolMap[VK_NUMPAD7] = KEY_KP_7; + s_keySymbolMap[VK_NUMPAD8] = KEY_KP_8; + s_keySymbolMap[VK_NUMPAD9] = KEY_KP_9; + s_keySymbolMap[VK_MULTIPLY] = KEY_KP_Multiply; + s_keySymbolMap[VK_ADD] = KEY_KP_Add; + s_keySymbolMap[VK_SEPARATOR] = KEY_KP_Separator; + s_keySymbolMap[VK_SUBTRACT] = KEY_KP_Subtract; + s_keySymbolMap[VK_DECIMAL] = KEY_KP_Decimal; + s_keySymbolMap[VK_DIVIDE] = KEY_KP_Divide; + s_keySymbolMap[VK_F1] = KEY_F1; + s_keySymbolMap[VK_F2] = KEY_F2; + s_keySymbolMap[VK_F3] = KEY_F3; + s_keySymbolMap[VK_F4] = KEY_F4; + s_keySymbolMap[VK_F5] = KEY_F5; + s_keySymbolMap[VK_F6] = KEY_F6; + s_keySymbolMap[VK_F7] = KEY_F7; + s_keySymbolMap[VK_F8] = KEY_F8; + s_keySymbolMap[VK_F9] = KEY_F9; + s_keySymbolMap[VK_F10] = KEY_F10; + s_keySymbolMap[VK_F11] = KEY_F11; + s_keySymbolMap[VK_F12] = KEY_F12; + s_keySymbolMap[VK_F13] = KEY_F13; + s_keySymbolMap[VK_F14] = KEY_F14; + s_keySymbolMap[VK_F15] = KEY_F15; + s_keySymbolMap[VK_F16] = KEY_F16; + s_keySymbolMap[VK_F17] = KEY_F17; + s_keySymbolMap[VK_F18] = KEY_F18; + s_keySymbolMap[VK_F19] = KEY_F19; + s_keySymbolMap[VK_F20] = KEY_F20; + s_keySymbolMap[VK_F21] = KEY_F21; + s_keySymbolMap[VK_F22] = KEY_F22; + s_keySymbolMap[VK_F23] = KEY_F23; + s_keySymbolMap[VK_F24] = KEY_F24; + + s_keySymbolMap[VK_NUMLOCK] = KEY_Num_Lock; + s_keySymbolMap[VK_SCROLL] = KEY_Scroll_Lock; + + s_keySymbolMap[VK_LSHIFT] = KEY_Shift_L; + s_keySymbolMap[VK_RSHIFT] = KEY_Shift_R; + s_keySymbolMap[VK_LCONTROL] = KEY_Control_L; + s_keySymbolMap[VK_RCONTROL] = KEY_Control_R; + s_keySymbolMap[VK_LMENU] = KEY_Menu; + s_keySymbolMap[VK_RMENU] = KEY_Menu; + s_keySymbolMap[VK_OEM_CLEAR] = KEY_Clear; +#else + + // no mapping required for non windows (i.e. X11 based) + // since the osgGA::GUIEventAdapter::KeySybol values are + // take from X11/keysymdef.h + +#endif + + return true; +} + +int EventAdapter::adaptKeySymbol(Producer::KeySymbol key) +{ + if (!s_keySymbolMapInitialized) s_keySymbolMapInitialized = initKeySymbolMap(); + + KeySymbolMap::iterator itr = s_keySymbolMap.find(key); + if (itr!=s_keySymbolMap.end()) return itr->second; + else return key; }