1 // input.hxx -- handle user input from various sources.
3 // Written by David Megginson, started May 2001.
5 // Copyright (C) 2001 David Megginson, david@megginson.com
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 # error This library requires C++
33 #include <simgear/compiler.h>
35 #include <simgear/misc/commands.hxx>
36 #include <simgear/misc/props.hxx>
38 #include <Main/fgfs.hxx>
39 #include <Main/globals.hxx>
48 * An input binding of some sort.
50 * <p>This class represents a binding that can be assigned to a
51 * keyboard key, a joystick button or axis, or even a panel
59 * Default constructor.
67 FGBinding (const FGBinding &binding);
71 * Convenience constructor.
73 * @param node The binding will be built from this node.
75 FGBinding (const SGPropertyNode * node);
81 virtual ~FGBinding ();
85 * Get the command name.
87 * @return The string name of the command for this binding.
89 virtual const string &getCommandName () const { return _command_name; }
93 * Get the command itself.
95 * @return The command associated with this binding, or 0 if none
98 virtual SGCommandMgr::command_t getCommand () const { return _command; }
102 * Get the argument that will be passed to the command.
104 * @return A property node that will be passed to the command as its
105 * argument, or 0 if none was supplied.
107 virtual const SGPropertyNode * getArg () { return _arg; }
111 * Read a binding from a property node.
113 * @param node The property node containing the binding.
115 virtual void read (const SGPropertyNode * node);
121 virtual void fire () const;
125 * Fire a binding with a setting (i.e. joystick axis).
127 * A double 'setting' property will be added to the arguments.
129 * @param setting The input setting, usually between -1.0 and 1.0.
131 virtual void fire (double setting) const;
135 string _command_name;
136 SGCommandMgr::command_t _command;
137 mutable SGPropertyNode * _arg;
138 mutable SGPropertyNode * _setting;
139 mutable SGCommandState * _command_state;
144 * Generic input module.
146 * <p>This module is designed to handle input from multiple sources --
147 * keyboard, joystick, mouse, or even panel switches -- in a consistent
148 * way, and to allow users to rebind any of the actions at runtime.</p>
150 class FGInput : public FGSubsystem
156 FG_MOD_UP = 1, // key- or button-up
160 FG_MOD_MAX = 16 // enough to handle all combinations
167 // Implementation of FGSubsystem.
169 virtual void init ();
170 virtual void bind ();
171 virtual void unbind ();
172 virtual void update ();
176 * Handle a single keystroke.
178 * <p>Note: for special keys, the integer key code will be the Glut
181 * @param k The integer key code, as returned by glut.
182 * @param modifiers Modifier keys pressed (bitfield).
183 * @param x The mouse x position at the time of keypress.
184 * @param y The mouse y position at the time of keypress.
189 virtual void doKey (int k, int modifiers, int x, int y);
204 MAX_AXES = _JS_MAX_AXES,
209 typedef vector<FGBinding> binding_list_t;
212 * Settings for a key or button.
216 : is_repeatable(false),
221 binding_list_t bindings[FG_MOD_MAX];
226 * Settings for a single joystick axis.
230 : last_value(9999999),
237 binding_list_t bindings[FG_MOD_MAX];
239 float high_threshold;
246 * Settings for a joystick.
249 virtual ~joystick () {
263 * Initialize key bindings.
265 void _init_keyboard ();
269 * Initialize joystick bindings.
271 void _init_joystick ();
275 * Initialize a single button.
277 inline void _init_button (const SGPropertyNode * node,
283 * Update the keyboard.
285 void _update_keyboard ();
289 * Update the joystick.
291 void _update_joystick ();
295 * Update a single button.
297 inline void _update_button (button &b, int modifiers, bool pressed);
301 * Read bindings and modifiers.
303 void _read_bindings (const SGPropertyNode * node,
304 binding_list_t * binding_list,
308 * Look up the bindings for a key code.
310 const vector<FGBinding> &_find_key_bindings (unsigned int k, int modifiers);
312 button _key_bindings[MAX_KEYS];
313 joystick _joystick_bindings[MAX_JOYSTICKS];
317 // Handle keyboard events
318 void GLUTkey(unsigned char k, int x, int y);
319 void GLUTkeyup(unsigned char k, int x, int y);
320 void GLUTspecialkey(int k, int x, int y);
321 void GLUTspecialkeyup(int k, int x, int y);
323 extern FGInput current_input;
325 #endif // _CONTROLS_HXX