////////////////////////////////////////////////////////////////////////
-FGInput::FGInput ()
+FGInput::FGInput () :
+ _key_event(fgGetNode("/devices/status/keyboard/event", true))
{
if (default_input == 0)
default_input = this;
fgTie("/devices/status/keyboard/shift", getModShift);
fgTie("/devices/status/keyboard/ctrl", getModCtrl);
fgTie("/devices/status/keyboard/alt", getModAlt);
+
+ _key_event->tie("key", SGRawValuePointer<int>(&_key_code));
+ _key_event->tie("pressed", SGRawValuePointer<bool>(&_key_pressed));
+ _key_event->tie("modifier", SGRawValuePointer<int>(&_key_modifiers));
+ _key_event->tie("modifier/shift", SGRawValuePointer<bool>(&_key_shift));
+ _key_event->tie("modifier/ctrl", SGRawValuePointer<bool>(&_key_ctrl));
+ _key_event->tie("modifier/alt", SGRawValuePointer<bool>(&_key_alt));
}
void
fgUntie("/devices/status/keyboard/shift");
fgUntie("/devices/status/keyboard/ctrl");
fgUntie("/devices/status/keyboard/alt");
+
+ _key_event->untie("key");
+ _key_event->untie("pressed");
+ _key_event->untie("modifier");
+ _key_event->untie("modifier/shift");
+ _key_event->untie("modifier/ctrl");
+ _key_event->untie("modifier/alt");
}
void
return;
}
+ _key_code = k;
+ _key_modifiers = modifiers & ~KEYMOD_RELEASED;
+ _key_pressed = bool(!(modifiers & KEYMOD_RELEASED));
+ _key_shift = bool(modifiers & KEYMOD_SHIFT);
+ _key_ctrl = bool(modifiers & KEYMOD_CTRL);
+ _key_alt = bool(modifiers & KEYMOD_ALT);
+ _key_event->fireValueChanged();
+ if (!_key_code)
+ return;
+
button &b = _key_bindings[k];
// Key pressed.
for (unsigned int i = 0; i < bindings.size(); i++)
bindings[i]->fire();
b.last_state = 0;
- } else {
- if (k >= 1 && k <= 26) {
- if (_key_bindings[k + '@'].last_state)
- doKey(k + '@', KEYMOD_RELEASED, x, y);
- if (_key_bindings[k + '`'].last_state)
- doKey(k + '`', KEYMOD_RELEASED, x, y);
- } else if (k >= 'A' && k <= 'Z') {
- if (_key_bindings[k - '@'].last_state)
- doKey(k - '@', KEYMOD_RELEASED, x, y);
- if (_key_bindings[tolower(k)].last_state)
- doKey(tolower(k), KEYMOD_RELEASED, x, y);
- } else if (k >= 'a' && k <= 'z') {
- if (_key_bindings[k - '`'].last_state)
- doKey(k - '`', KEYMOD_RELEASED, x, y);
- if (_key_bindings[toupper(k)].last_state)
- doKey(toupper(k), KEYMOD_RELEASED, x, y);
- }
}
}
}
currentModifiers = modifiers;
if (eventType == osgGA::GUIEventAdapter::KEYUP)
modifiers |= KEYMOD_RELEASED;
+
+ // Release the letter key, for which the keypress was reported
+ if (key >= 0 && key < int(sizeof(release_keys))) {
+ if (modifiers & KEYMOD_RELEASED) {
+ key = release_keys[key];
+ } else {
+ release_keys[key] = key;
+ if (key >= 1 && key <= 26) {
+ release_keys[key + '@'] = key;
+ release_keys[key + '`'] = key;
+ } else if (key >= 'A' && key <= 'Z') {
+ release_keys[key - '@'] = key;
+ release_keys[tolower(key)] = key;
+ } else if (key >= 'a' && key <= 'z') {
+ release_keys[key - '`'] = key;
+ release_keys[toupper(key)] = key;
+ }
+ }
+ }
}
callKeyHandler(256 + k, fgGetKeyModifiers(), x, y);
}
+static unsigned char release_keys[256];
+
static void GLUTkeyup(unsigned char k, int x, int y)
{
GlutModifiers = glutGetModifiers();
- callKeyHandler(k, fgGetKeyModifiers() | KEYMOD_RELEASED, x, y);
+ callKeyHandler(release_keys[k], fgGetKeyModifiers() | KEYMOD_RELEASED, x, y);
}
static void GLUTkey(unsigned char k, int x, int y)
{
GlutModifiers = glutGetModifiers();
+ release_keys[k] = k;
+ if (k >= 1 && k <= 26) {
+ release_keys[k + '@'] = k;
+ release_keys[k + '`'] = k;
+ } else if (k >= 'A' && k <= 'Z') {
+ release_keys[k - '@'] = k;
+ release_keys[tolower(k)] = k;
+ } else if (k >= 'a' && k <= 'z') {
+ release_keys[k - '`'] = k;
+ release_keys[toupper(k)] = k;
+ }
callKeyHandler(k, fgGetKeyModifiers(), x, y);
}