# error This library requires C++
#endif
+#include <plib/js.h>
+
#include <simgear/compiler.h>
#include <simgear/misc/commands.hxx>
{
public:
+ /**
+ * Default constructor.
+ */
FGBinding ();
+
+
+ /**
+ * Copy constructor.
+ */
+ FGBinding (const FGBinding &binding);
+
+
+ /**
+ * Convenience constructor.
+ *
+ * @param node The binding will be built from this node.
+ */
FGBinding (const SGPropertyNode * node);
+
+
+ /**
+ * Destructor.
+ */
virtual ~FGBinding ();
+
+ /**
+ * Get the command name.
+ *
+ * @return The string name of the command for this binding.
+ */
virtual const string &getCommandName () const { return _command_name; }
+
+
+ /**
+ * Get the command itself.
+ *
+ * @return The command associated with this binding, or 0 if none
+ * is present.
+ */
virtual SGCommandMgr::command_t getCommand () const { return _command; }
+
+
+ /**
+ * Get the argument that will be passed to the command.
+ *
+ * @return A property node that will be passed to the command as its
+ * argument, or 0 if none was supplied.
+ */
virtual const SGPropertyNode * getArg () { return _arg; }
+
+ /**
+ * Read a binding from a property node.
+ *
+ * @param node The property node containing the binding.
+ */
virtual void read (const SGPropertyNode * node);
+
+ /**
+ * Fire a binding.
+ */
virtual void fire () const;
-// virtual void fire (double value);
-// virtual void fire (int xdelta, int ydelta);
+
+
+ /**
+ * Fire a binding with a setting (i.e. joystick axis).
+ *
+ * A double 'setting' property will be added to the arguments.
+ *
+ * @param setting The input setting, usually between -1.0 and 1.0.
+ */
+ virtual void fire (double setting) const;
+
private:
string _command_name;
SGCommandMgr::command_t _command;
- const SGPropertyNode * _arg;
+ mutable SGPropertyNode * _arg;
+ mutable SGPropertyNode * _setting;
+ mutable SGCommandState * _command_state;
};
enum {
FG_MOD_NONE = 0,
- FG_MOD_SHIFT = 1,
- FG_MOD_CTRL = 2,
- FG_MOD_ALT = 4,
- FG_MOD_MAX = 8 // one past all modifiers
+ FG_MOD_UP = 1, // key- or button-up
+ FG_MOD_SHIFT = 2,
+ FG_MOD_CTRL = 4,
+ FG_MOD_ALT = 8,
+ FG_MOD_MAX = 16 // enough to handle all combinations
};
FGInput();
private:
+ // Constants
+ enum
+ {
+ MAX_KEYS = 1024,
+
+ #ifdef WIN32
+ MAX_JOYSTICKS = 2,
+ #else
+ MAX_JOYSTICKS = 10,
+ #endif
+ MAX_AXES = _JS_MAX_AXES,
+ MAX_BUTTONS = 32
+ };
+
+
+ typedef vector<FGBinding> binding_list_t;
+
+ /**
+ * Settings for a key or button.
+ */
+ struct button {
+ button ()
+ : is_repeatable(false),
+ last_state(-1)
+ {}
+ bool is_repeatable;
+ int last_state;
+ binding_list_t bindings[FG_MOD_MAX];
+ };
+
+
+ /**
+ * Settings for a single joystick axis.
+ */
+ struct axis {
+ axis ()
+ : last_value(9999999),
+ tolerance(0.002),
+ low_threshold(-0.9),
+ high_threshold(0.9)
+ {}
+ float last_value;
+ float tolerance;
+ binding_list_t bindings[FG_MOD_MAX];
+ float low_threshold;
+ float high_threshold;
+ struct button low;
+ struct button high;
+ };
+
+
+ /**
+ * Settings for a joystick.
+ */
+ struct joystick {
+ virtual ~joystick () {
+ delete js;
+ delete[] axes;
+ delete[] buttons;
+ }
+ int naxes;
+ int nbuttons;
+ jsJoystick * js;
+ axis * axes;
+ button * buttons;
+ };
+
+
+ /**
+ * Initialize key bindings.
+ */
+ void _init_keyboard ();
+
+
+ /**
+ * Initialize joystick bindings.
+ */
+ void _init_joystick ();
+
+
+ /**
+ * Initialize a single button.
+ */
+ inline void _init_button (const SGPropertyNode * node,
+ button &b,
+ const string name);
+
+
+ /**
+ * Update the keyboard.
+ */
+ void _update_keyboard ();
+
+
+ /**
+ * Update the joystick.
+ */
+ void _update_joystick ();
+
+
+ /**
+ * Update a single button.
+ */
+ inline void _update_button (button &b, int modifiers, bool pressed);
+
+
+ /**
+ * Read bindings and modifiers.
+ */
+ void _read_bindings (const SGPropertyNode * node,
+ binding_list_t * binding_list,
+ int modifiers);
+
/**
* Look up the bindings for a key code.
*/
- const vector<FGBinding> * _find_bindings (int k, int modifiers);
+ const vector<FGBinding> &_find_key_bindings (unsigned int k, int modifiers);
- typedef map<int,vector<FGBinding> > keyboard_map;
- keyboard_map _key_bindings[FG_MOD_MAX];
+ button _key_bindings[MAX_KEYS];
+ joystick _joystick_bindings[MAX_JOYSTICKS];
};
+// Handle keyboard events
+void GLUTkey(unsigned char k, int x, int y);
+void GLUTkeyup(unsigned char k, int x, int y);
+void GLUTspecialkey(int k, int x, int y);
+void GLUTspecialkeyup(int k, int x, int y);
+
extern FGInput current_input;
#endif // _CONTROLS_HXX