# include <config.h>
#endif
-#ifdef HAVE_WINDOWS_H
-# include <windows.h>
-#endif
-
#include <simgear/compiler.h>
#include <math.h>
#include <ctype.h>
#include <sstream>
-#include STL_FSTREAM
-#include STL_STRING
+#include <fstream>
+#include <string>
#include <vector>
#include <simgear/compiler.h>
// Local functions.
////////////////////////////////////////////////////////////////////////
+static int
+getModifiers ()
+{
+ return fgGetKeyModifiers() >> 1;
+}
+
static bool
getModShift ()
{
return bool(fgGetKeyModifiers() & KEYMOD_SUPER);
}
+static bool
+getModHyper ()
+{
+ return bool(fgGetKeyModifiers() & KEYMOD_HYPER);
+}
+
\f
////////////////////////////////////////////////////////////////////////
// Implementation of FGInput.
void
FGInput::bind ()
{
+ fgTie("/devices/status/keyboard", getModifiers);
fgTie("/devices/status/keyboard/shift", getModShift);
fgTie("/devices/status/keyboard/ctrl", getModCtrl);
fgTie("/devices/status/keyboard/alt", getModAlt);
fgTie("/devices/status/keyboard/meta", getModMeta);
fgTie("/devices/status/keyboard/super", getModSuper);
+ fgTie("/devices/status/keyboard/hyper", getModHyper);
_key_event->tie("key", SGRawValuePointer<int>(&_key_code));
_key_event->tie("pressed", SGRawValuePointer<bool>(&_key_pressed));
_key_event->tie("modifier/alt", SGRawValuePointer<bool>(&_key_alt));
_key_event->tie("modifier/meta", SGRawValuePointer<bool>(&_key_meta));
_key_event->tie("modifier/super", SGRawValuePointer<bool>(&_key_super));
+ _key_event->tie("modifier/hyper", SGRawValuePointer<bool>(&_key_hyper));
}
void
FGInput::unbind ()
{
+ fgUntie("/devices/status/keyboard");
fgUntie("/devices/status/keyboard/shift");
fgUntie("/devices/status/keyboard/ctrl");
fgUntie("/devices/status/keyboard/alt");
fgUntie("/devices/status/keyboard/meta");
fgUntie("/devices/status/keyboard/super");
+ fgUntie("/devices/status/keyboard/hyper");
_key_event->untie("key");
_key_event->untie("pressed");
_key_event->untie("modifier/alt");
_key_event->untie("modifier/meta");
_key_event->untie("modifier/super");
+ _key_event->untie("modifier/hyper");
}
void
}
_key_code = k;
- _key_modifiers = modifiers & ~KEYMOD_RELEASED;
+ _key_modifiers = modifiers >> 1;
_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_meta = bool(modifiers & KEYMOD_META);
_key_super = bool(modifiers & KEYMOD_SUPER);
+ _key_hyper = bool(modifiers & KEYMOD_HYPER);
_key_event->fireValueChanged();
- if (!_key_code)
+ if (_key_code < 0)
return;
k = _key_code;
- modifiers = _key_modifiers | (_key_pressed ? KEYMOD_NONE : KEYMOD_RELEASED);
+ modifiers = _key_modifiers << 1;
+ if (!_key_pressed)
+ modifiers |= KEYMOD_RELEASED;
button &b = _key_bindings[k];
// Key pressed.
}
if (mode.pass_through) {
- // The pu stuff seems to need that. May be it does opengl picking ...
- fgMakeCurrent();
if (0 <= x && 0 <= y && puMouse(b, updown, x, y))
return;
else if (0 <= x && 0 <= y && (globals->get_current_panel() != 0) &&
if (node->getChild("mod-super") != 0)
_read_bindings(node->getChild("mod-super"), binding_list,
modifiers|KEYMOD_SUPER);
+
+ if (node->getChild("mod-hyper") != 0)
+ _read_bindings(node->getChild("mod-hyper"), binding_list,
+ modifiers|KEYMOD_HYPER);
}
FGInput::mouse::mouse ()
: x(-1),
y(-1),
+ save_x(-1),
+ save_y(-1),
nModes(1),
current_mode(0),
modes(0)