diff --git a/include/osgGA/GUIEventAdapter b/include/osgGA/GUIEventAdapter index 625842fb0..f1d5e2d39 100644 --- a/include/osgGA/GUIEventAdapter +++ b/include/osgGA/GUIEventAdapter @@ -33,40 +33,190 @@ class OSGGA_EXPORT GUIEventAdapter : public osg::Referenced public: enum MouseButtonMask { - LEFT_MOUSE_BUTTON=1, - MIDDLE_MOUSE_BUTTON=2, - RIGHT_MOUSE_BUTTON=4 + LEFT_MOUSE_BUTTON=1, + MIDDLE_MOUSE_BUTTON=2, + RIGHT_MOUSE_BUTTON=4 }; enum EventType { - PUSH, - RELEASE, - DOUBLECLICK, - DRAG, - MOVE, - KEYDOWN, - KEYUP, - FRAME, - RESIZE, - NONE + PUSH, + RELEASE, + DOUBLECLICK, + DRAG, + MOVE, + KEYDOWN, + KEYUP, + FRAME, + RESIZE, + NONE }; - enum ModKeyMask { - MODKEY_LEFT_SHIFT = 0x0001, - MODKEY_RIGHT_SHIFT = 0x0002, - MODKEY_LEFT_CTRL = 0x0040, - MODKEY_RIGHT_CTRL = 0x0080, - MODKEY_LEFT_ALT = 0x0100, - MODKEY_RIGHT_ALT = 0x0200, - MODKEY_LEFT_META = 0x0400, - MODKEY_RIGHT_META = 0x0800, - MODKEY_NUM_LOCK = 0x1000, - MODKEY_CAPS_LOCK = 0x2000, + enum KeySybmol + { + KEY_BackSpace = 0xFF08, /* back space, back char */ + KEY_Tab = 0xFF09, + KEY_Linefeed = 0xFF0A, /* Linefeed, LF */ + KEY_Clear = 0xFF0B, + KEY_Return = 0xFF0D, /* Return, enter */ + KEY_Pause = 0xFF13, /* Pause, hold */ + KEY_Scroll_Lock = 0xFF14, + KEY_Sys_Req = 0xFF15, + KEY_Escape = 0xFF1B, + KEY_Delete = 0xFFFF, /* Delete, rubout */ + + + /* Cursor control & motion */ + + KEY_Home = 0xFF50, + KEY_Left = 0xFF51, /* Move left, left arrow */ + KEY_Up = 0xFF52, /* Move up, up arrow */ + KEY_Right = 0xFF53, /* Move right, right arrow */ + KEY_Down = 0xFF54, /* Move down, down arrow */ + KEY_Prior = 0xFF55, /* Prior, previous */ + KEY_Page_Up = 0xFF55, + KEY_Next = 0xFF56, /* Next */ + KEY_Page_Down = 0xFF56, + KEY_End = 0xFF57, /* EOL */ + KEY_Begin = 0xFF58, /* BOL */ + + + /* Misc Functions */ + + KEY_Select = 0xFF60, /* Select, mark */ + KEY_Print = 0xFF61, + KEY_Execute = 0xFF62, /* Execute, run, do */ + KEY_Insert = 0xFF63, /* Insert, insert here */ + KEY_Undo = 0xFF65, /* Undo, oops */ + KEY_Redo = 0xFF66, /* redo, again */ + KEY_Menu = 0xFF67, + KEY_Find = 0xFF68, /* Find, search */ + KEY_Cancel = 0xFF69, /* Cancel, stop, abort, exit */ + KEY_Help = 0xFF6A, /* Help */ + KEY_Break = 0xFF6B, + KEY_Mode_switch = 0xFF7E, /* Character set switch */ + KEY_script_switch = 0xFF7E, /* Alias for mode_switch */ + KEY_Num_Lock = 0xFF7F, + + /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + + KEY_KP_Space = 0xFF80, /* space */ + KEY_KP_Tab = 0xFF89, + KEY_KP_Enter = 0xFF8D, /* enter */ + KEY_KP_F1 = 0xFF91, /* PF1, KP_A, ... */ + KEY_KP_F2 = 0xFF92, + KEY_KP_F3 = 0xFF93, + KEY_KP_F4 = 0xFF94, + KEY_KP_Home = 0xFF95, + KEY_KP_Left = 0xFF96, + KEY_KP_Up = 0xFF97, + KEY_KP_Right = 0xFF98, + KEY_KP_Down = 0xFF99, + KEY_KP_Prior = 0xFF9A, + KEY_KP_Page_Up = 0xFF9A, + KEY_KP_Next = 0xFF9B, + KEY_KP_Page_Down = 0xFF9B, + KEY_KP_End = 0xFF9C, + KEY_KP_Begin = 0xFF9D, + KEY_KP_Insert = 0xFF9E, + KEY_KP_Delete = 0xFF9F, + KEY_KP_Equal = 0xFFBD, /* equals */ + KEY_KP_Multiply = 0xFFAA, + KEY_KP_Add = 0xFFAB, + KEY_KP_Separator = 0xFFAC, /* separator, often comma */ + KEY_KP_Subtract = 0xFFAD, + KEY_KP_Decimal = 0xFFAE, + KEY_KP_Divide = 0xFFAF, + + KEY_KP_0 = 0xFFB0, + KEY_KP_1 = 0xFFB1, + KEY_KP_2 = 0xFFB2, + KEY_KP_3 = 0xFFB3, + KEY_KP_4 = 0xFFB4, + KEY_KP_5 = 0xFFB5, + KEY_KP_6 = 0xFFB6, + KEY_KP_7 = 0xFFB7, + KEY_KP_8 = 0xFFB8, + KEY_KP_9 = 0xFFB9, + + /* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + + KEY_F1 = 0xFFBE, + KEY_F2 = 0xFFBF, + KEY_F3 = 0xFFC0, + KEY_F4 = 0xFFC1, + KEY_F5 = 0xFFC2, + KEY_F6 = 0xFFC3, + KEY_F7 = 0xFFC4, + KEY_F8 = 0xFFC5, + KEY_F9 = 0xFFC6, + KEY_F10 = 0xFFC7, + KEY_F11 = 0xFFC8, + KEY_F12 = 0xFFC9, + KEY_F13 = 0xFFCA, + KEY_F14 = 0xFFCB, + KEY_F15 = 0xFFCC, + KEY_F16 = 0xFFCD, + KEY_F17 = 0xFFCE, + KEY_F18 = 0xFFCF, + KEY_F19 = 0xFFD0, + KEY_F20 = 0xFFD1, + KEY_F21 = 0xFFD2, + KEY_F22 = 0xFFD3, + KEY_F23 = 0xFFD4, + KEY_F24 = 0xFFD5, + KEY_F25 = 0xFFD6, + KEY_F26 = 0xFFD7, + KEY_F27 = 0xFFD8, + KEY_F28 = 0xFFD9, + KEY_F29 = 0xFFDA, + KEY_F30 = 0xFFDB, + KEY_F31 = 0xFFDC, + KEY_F32 = 0xFFDD, + KEY_F33 = 0xFFDE, + KEY_F34 = 0xFFDF, + KEY_F35 = 0xFFE0, + + /* Modifiers */ + + KEY_Shift_L = 0xFFE1, /* Left shift */ + KEY_Shift_R = 0xFFE2, /* Right shift */ + KEY_Control_L = 0xFFE3, /* Left control */ + KEY_Control_R = 0xFFE4, /* Right control */ + KEY_Caps_Lock = 0xFFE5, /* Caps lock */ + KEY_Shift_Lock = 0xFFE6, /* Shift lock */ + + KEY_Meta_L = 0xFFE7, /* Left meta */ + KEY_Meta_R = 0xFFE8, /* Right meta */ + KEY_Alt_L = 0xFFE9, /* Left alt */ + KEY_Alt_R = 0xFFEA, /* Right alt */ + KEY_Super_L = 0xFFEB, /* Left super */ + KEY_Super_R = 0xFFEC, /* Right super */ + KEY_Hyper_L = 0xFFED, /* Left hyper */ + KEY_Hyper_R = 0xFFEE, /* Right hyper */ + }; + + + enum ModKeyMask { + MODKEY_LEFT_SHIFT = 0x0001, + MODKEY_RIGHT_SHIFT = 0x0002, + MODKEY_LEFT_CTRL = 0x0040, + MODKEY_RIGHT_CTRL = 0x0080, + MODKEY_LEFT_ALT = 0x0100, + MODKEY_RIGHT_ALT = 0x0200, + MODKEY_LEFT_META = 0x0400, + MODKEY_RIGHT_META = 0x0800, + MODKEY_NUM_LOCK = 0x1000, + MODKEY_CAPS_LOCK = 0x2000, MODKEY_CTRL = (MODKEY_LEFT_CTRL|MODKEY_RIGHT_CTRL), MODKEY_SHIFT = (MODKEY_LEFT_SHIFT|MODKEY_RIGHT_SHIFT), MODKEY_ALT = (MODKEY_LEFT_ALT|MODKEY_RIGHT_ALT), MODKEY_META = (MODKEY_LEFT_META|MODKEY_RIGHT_META) - }; + }; /** Get the EventType of the GUI event.*/ diff --git a/include/osgProducer/EventAdapter b/include/osgProducer/EventAdapter index 91f850f86..0fb1487aa 100644 --- a/include/osgProducer/EventAdapter +++ b/include/osgProducer/EventAdapter @@ -126,6 +126,8 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter static int _s_mx; static int _s_my; static int _s_modKeyMask; + + int adaptKeySymbol(Producer::KeySymbol key); }; diff --git a/src/osgProducer/EventAdapter.cpp b/src/osgProducer/EventAdapter.cpp index eb8b9aa93..4aa7d5781 100644 --- a/src/osgProducer/EventAdapter.cpp +++ b/src/osgProducer/EventAdapter.cpp @@ -157,7 +157,7 @@ void EventAdapter::adaptKeyPress( double time, Producer::KeySymbol key) { _eventType = KEYDOWN; _time = time; - _key = key; + _key = adaptKeySymbol(key); copyStaticVariables(); } @@ -167,7 +167,7 @@ void EventAdapter::adaptKeyRelease( double time, Producer::KeySymbol key) // we won't handle this correctly right now.. GUIEventAdapter isn't up to it _eventType = KEYUP; _time = time; - _key = key; + _key = adaptKeySymbol(key); copyStaticVariables(); } @@ -182,3 +182,18 @@ void EventAdapter::adaptFrame(double time) copyStaticVariables(); } + +int EventAdapter::adaptKeySymbol(Producer::KeySymbol key) +{ + #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 +} + diff --git a/src/osgProducer/KeyboardMouseCallback.cpp b/src/osgProducer/KeyboardMouseCallback.cpp index 67c87eed4..4998380ce 100644 --- a/src/osgProducer/KeyboardMouseCallback.cpp +++ b/src/osgProducer/KeyboardMouseCallback.cpp @@ -12,26 +12,14 @@ using namespace osgProducer; void KeyboardMouseCallback::keyPress( Producer::KeySymbol key ) { - if (_escapeKeySetsDone) - { - switch( key ) - { - #ifdef XK_MISCELLANY // XWindows keydefs - case XK_Escape: - _done = true; - break; - #endif - #ifdef WIN32 - case VK_ESCAPE: - _done = true; - break; - #endif - } - } osg::ref_ptr event = new EventAdapter; event->adaptKeyPress(getTime(),key); - + + // check against adapted key symbol. + if (_escapeKeySetsDone && + event->getKey()==osgGA::GUIEventAdapter::KEY_Escape) _done = true; + _eventQueueMutex.lock(); _eventQueue.push_back(event); _eventQueueMutex.unlock();