X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2Finput.hxx;h=2ea4217e922a66fc13894244f66b298638120eba;hb=72fbb0f3f55570b07c4f2f322a5274d76c0318ee;hp=2e2dc87033420926f6a3b0e64bf5a31ae03a63c0;hpb=38f29c3d86ddfb101fae8b5002d31e0f556c420e;p=flightgear.git diff --git a/src/Input/input.hxx b/src/Input/input.hxx index 2e2dc8703..2ea4217e9 100644 --- a/src/Input/input.hxx +++ b/src/Input/input.hxx @@ -28,8 +28,11 @@ # error This library requires C++ #endif +#include + #include +#include #include #include
@@ -41,6 +44,13 @@ SG_USING_STD(map); SG_USING_STD(vector); + + +//////////////////////////////////////////////////////////////////////// +// General binding support. +//////////////////////////////////////////////////////////////////////// + + /** * An input binding of some sort. * @@ -48,46 +58,101 @@ SG_USING_STD(vector); * keyboard key, a joystick button or axis, or even a panel * instrument.

*/ -class FGBinding +class FGBinding : public FGConditional { public: - enum Action { - ACTION_NONE, - ACTION_SWITCH, - ACTION_ADJUST, - ACTION_ASSIGN - }; - + /** + * Default constructor. + */ FGBinding (); + + + /** + * Convenience constructor. + * + * @param node The binding will be built from this node. + */ FGBinding (const SGPropertyNode * node); + + + /** + * Destructor. + */ virtual ~FGBinding (); - virtual Action getAction () const { return _action; } - virtual SGPropertyNode * getProperty () { return _node; } - virtual const SGPropertyNode * getProperty () const { return _node; } - virtual const SGValue * getAdjustStep () const { return _adjust_step; } - virtual const SGValue * getAssignValue () const { return _assign_value; } + + /** + * 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; } - virtual void setAction (Action action); - virtual void setProperty (SGPropertyNode * node); - virtual void setAdjustStep (const SGValue * step); - virtual void setAssignValue (const SGValue * value); + /** + * 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 scaled movement (rather than absolute position). + */ + virtual void fire (double offset, double max) const; + + + /** + * 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: - Action _action; - SGPropertyNode * _node; - const SGValue * _adjust_step; - const SGValue * _assign_value; + string _command_name; + SGCommandMgr::command_t _command; + mutable SGPropertyNode * _arg; + mutable SGPropertyNode * _setting; + mutable SGCommandState * _command_state; }; + +//////////////////////////////////////////////////////////////////////// +// General input mapping support. +//////////////////////////////////////////////////////////////////////// + + /** * Generic input module. * @@ -101,13 +166,23 @@ public: 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(); + + /** + * Default constructor. + */ + FGInput (); + + + /** + * Destructor. + */ virtual ~FGInput(); // @@ -116,7 +191,7 @@ public: virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (); + virtual void update (double dt); /** @@ -137,48 +212,271 @@ public: /** - * Fire off a single-trigger action. - * - *

This method fires an action triggered by a key or button - * press, with no additional quantity information.

+ * Handle a mouse click event. * - * @param binding The property node with the binding. + * @param button The mouse button selected. + * @param updown Button status. + * @param x The X position of the mouse event, in screen coordinates. + * @param y The Y position of the mouse event, in screen coordinates. */ - virtual void action (const SGPropertyNode * binding); + virtual void doMouseClick (int button, int updown, int x, int y); /** - * Fire off a quantity action. - * - *

This method fires an action triggered by a change in value, - * such as a slider or axis.

+ * Handle mouse motion. * - * @param action The property node with the binding. - * @param value The new value. + * @param x The new mouse x position, in screen coordinates. + * @param y The new mouse y position, in screen coordinates. + */ + virtual void doMouseMotion (int x, int y); + + +private: + // Constants + enum + { + MAX_KEYS = 1024, + + #ifdef WIN32 + MAX_JOYSTICKS = 2, + #else + MAX_JOYSTICKS = 10, + #endif + MAX_JOYSTICK_AXES = _JS_MAX_AXES, + MAX_JOYSTICK_BUTTONS = 32, + + MAX_MICE = 1, + MAX_MOUSE_BUTTONS = 8 + }; + struct mouse; + friend struct mouse; + + typedef vector binding_list_t; + + /** + * Settings for a key or button. */ -// virtual void action (const SGPropertyNode * binding, double value); + struct button { + button (); + virtual ~button (); + bool is_repeatable; + int last_state; + binding_list_t bindings[FG_MOD_MAX]; + }; /** - * Fire off a movement action. - * - *

This method fires an action triggered by relative movement - * rather than an absolute value; it is especially applicable to - * mouse-movement bindings.

- * - * @param binding The property node containing the binding. - * @param xdelta The amount of X movement. - * @param ydelta The amount of Y movement. + * Settings for a single joystick axis. + */ + struct axis { + axis (); + virtual ~axis (); + 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. */ -// virtual void action (const SGPropertyNode * binding, int xdelta, int ydelta); + struct joystick { + joystick (); + virtual ~joystick (); + int jsnum; + jsJoystick * js; + int naxes; + int nbuttons; + axis * axes; + button * buttons; + }; -private: - typedef map > keyboard_map; - keyboard_map _key_bindings[FG_MOD_MAX]; + /** + * Settings for a mouse mode. + */ + struct mouse_mode { + mouse_mode (); + virtual ~mouse_mode (); + int cursor; + bool constrained; + bool pass_through; + button * buttons; + binding_list_t x_bindings[FG_MOD_MAX]; + binding_list_t y_bindings[FG_MOD_MAX]; + }; + + + /** + * Settings for a mouse. + */ + struct mouse { + mouse (); + virtual ~mouse (); + int x; + int y; + SGPropertyNode * mode_node; + SGPropertyNode * mouse_button_nodes[MAX_MOUSE_BUTTONS]; + int nModes; + int current_mode; + mouse_mode * modes; + }; + + + /** + * Initialize key bindings. + */ + void _init_keyboard (); + + + /** + * Initialize joystick bindings. + */ + void _init_joystick (); + + + /** + * Initialize mouse bindings. + */ + void _init_mouse (); + + + /** + * 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 the mouse. + */ + void _update_mouse (); + + + /** + * Update a single button. + */ + inline void _update_button (button &b, int modifiers, bool pressed, + int x, int y); + + + /** + * 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 &_find_key_bindings (unsigned int k, + int modifiers); + + button _key_bindings[MAX_KEYS]; + joystick _joystick_bindings[MAX_JOYSTICKS]; + mouse _mouse_bindings[MAX_MICE]; }; + extern FGInput current_input; -#endif // _CONTROLS_HXX + + +//////////////////////////////////////////////////////////////////////// +// GLUT callbacks. +//////////////////////////////////////////////////////////////////////// + +// Handle GLUT events. +extern "C" { + +/** + * Key-down event handler for Glut. + * + *

Pass the value on to the FGInput module unless PUI wants it.

+ * + * @param k The integer value for the key pressed. + * @param x (unused) + * @param y (unused) + */ +void GLUTkey (unsigned char k, int x, int y); + + +/** + * Key-up event handler for GLUT. + * + *

PUI doesn't use this, so always pass it to the input manager.

+ * + * @param k The integer value for the key pressed. + * @param x (unused) + * @param y (unused) + */ +void GLUTkeyup (unsigned char k, int x, int y); + + +/** + * Special key-down handler for Glut. + * + *

Pass the value on to the FGInput module unless PUI wants it. + * The key value will have 256 added to it.

+ * + * @param k The integer value for the key pressed (will have 256 added + * to it). + * @param x (unused) + * @param y (unused) + */ +void GLUTspecialkey (int k, int x, int y); + + +/** + * Special key-up handler for Glut. + * + * @param k The integer value for the key pressed (will have 256 added + * to it). + * @param x (unused) + * @param y (unused) + */ +void GLUTspecialkeyup (int k, int x, int y); + + +/** + * Mouse click handler for Glut. + * + * @param button The mouse button pressed. + * @param updown Press or release flag. + * @param x The x-location of the click. + * @param y The y-location of the click. + */ +void GLUTmouse (int button, int updown, int x, int y); + + +/** + * Mouse motion handler for Glut. + * + * @param x The new x-location of the mouse. + * @param y The new y-location of the mouse. + */ +void GLUTmotion (int x, int y); + +} // extern "C" + +#endif // _INPUT_HXX