X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2Finput.hxx;h=2ea4217e922a66fc13894244f66b298638120eba;hb=72fbb0f3f55570b07c4f2f322a5274d76c0318ee;hp=c046ba69d2e0bf284d46b63e1e4905441cfd7db2;hpb=d9bcec28510cac77a55b003d50f721a18bfbe32a;p=flightgear.git diff --git a/src/Input/input.hxx b/src/Input/input.hxx index c046ba69d..2ea4217e9 100644 --- a/src/Input/input.hxx +++ b/src/Input/input.hxx @@ -44,6 +44,13 @@ SG_USING_STD(map); SG_USING_STD(vector); + + +//////////////////////////////////////////////////////////////////////// +// General binding support. +//////////////////////////////////////////////////////////////////////// + + /** * An input binding of some sort. * @@ -51,7 +58,7 @@ SG_USING_STD(vector); * keyboard key, a joystick button or axis, or even a panel * instrument.

*/ -class FGBinding +class FGBinding : public FGConditional { public: @@ -61,12 +68,6 @@ public: FGBinding (); - /** - * Copy constructor. - */ - FGBinding (const FGBinding &binding); - - /** * Convenience constructor. * @@ -121,6 +122,12 @@ public: virtual void fire () const; + /** + * 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). * @@ -140,6 +147,12 @@ private: }; + +//////////////////////////////////////////////////////////////////////// +// General input mapping support. +//////////////////////////////////////////////////////////////////////// + + /** * Generic input module. * @@ -160,7 +173,16 @@ public: FG_MOD_MAX = 16 // enough to handle all combinations }; - FGInput(); + + /** + * Default constructor. + */ + FGInput (); + + + /** + * Destructor. + */ virtual ~FGInput(); // @@ -169,7 +191,7 @@ public: virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (); + virtual void update (double dt); /** @@ -189,8 +211,27 @@ public: virtual void doKey (int k, int modifiers, int x, int y); -private: + /** + * Handle a mouse click event. + * + * @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 doMouseClick (int button, int updown, int x, int y); + + + /** + * Handle mouse motion. + * + * @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 { @@ -201,21 +242,23 @@ private: #else MAX_JOYSTICKS = 10, #endif - MAX_AXES = _JS_MAX_AXES, - MAX_BUTTONS = 32 - }; + 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; + typedef vector binding_list_t; /** * Settings for a key or button. */ struct button { - button () - : is_repeatable(false), - last_state(-1) - {} + button (); + virtual ~button (); bool is_repeatable; int last_state; binding_list_t bindings[FG_MOD_MAX]; @@ -226,12 +269,8 @@ private: * Settings for a single joystick axis. */ struct axis { - axis () - : last_value(9999999), - tolerance(0.002), - low_threshold(-0.9), - high_threshold(0.9) - {} + axis (); + virtual ~axis (); float last_value; float tolerance; binding_list_t bindings[FG_MOD_MAX]; @@ -246,19 +285,48 @@ private: * Settings for a joystick. */ struct joystick { - virtual ~joystick () { - delete js; - delete[] axes; - delete[] buttons; - } + joystick (); + virtual ~joystick (); + int jsnum; + jsJoystick * js; int naxes; int nbuttons; - jsJoystick * js; axis * axes; button * buttons; }; + /** + * 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. */ @@ -271,6 +339,12 @@ private: void _init_joystick (); + /** + * Initialize mouse bindings. + */ + void _init_mouse (); + + /** * Initialize a single button. */ @@ -291,10 +365,17 @@ private: void _update_joystick (); + /** + * Update the mouse. + */ + void _update_mouse (); + + /** * Update a single button. */ - inline void _update_button (button &b, int modifiers, bool pressed); + inline void _update_button (button &b, int modifiers, bool pressed, + int x, int y); /** @@ -307,19 +388,95 @@ private: /** * Look up the bindings for a key code. */ - const vector &_find_key_bindings (unsigned int k, int modifiers); + 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]; }; -// 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 + + +//////////////////////////////////////////////////////////////////////// +// 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