2001-05-23 22:59:40 +00:00
|
|
|
|
// input.hxx -- handle user input from various sources.
|
|
|
|
|
//
|
|
|
|
|
// Written by David Megginson, started May 2001.
|
|
|
|
|
//
|
|
|
|
|
// Copyright (C) 2001 David Megginson, david@megginson.com
|
|
|
|
|
//
|
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
// General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
//
|
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _INPUT_HXX
|
|
|
|
|
#define _INPUT_HXX
|
|
|
|
|
|
|
|
|
|
#ifndef __cplusplus
|
|
|
|
|
# error This library requires C++
|
|
|
|
|
#endif
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
#include <plib/js.h>
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#include <plib/ul.h>
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <simgear/structure/subsystem_mgr.hxx>
|
|
|
|
|
#include <simgear/structure/commands.hxx>
|
2003-05-06 23:46:24 +00:00
|
|
|
|
#include <simgear/props/condition.hxx>
|
|
|
|
|
#include <simgear/props/props.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
#include <Main/fg_os.hxx>
|
2003-01-18 15:16:54 +00:00
|
|
|
|
#include <Main/fg_props.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
SG_USING_STD(map);
|
|
|
|
|
SG_USING_STD(vector);
|
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
2004-04-27 08:43:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( UL_WIN32 )
|
2004-04-28 08:03:40 +00:00
|
|
|
|
#define TGT_PLATFORM "windows"
|
2004-05-06 16:07:30 +00:00
|
|
|
|
#elif defined ( UL_MAC_OSX )
|
|
|
|
|
#define TGT_PLATFORM "mac"
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#else
|
2004-04-28 08:03:40 +00:00
|
|
|
|
#define TGT_PLATFORM "unix"
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#endif
|
2003-01-18 15:16:54 +00:00
|
|
|
|
|
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// General binding support.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* An input binding of some sort.
|
|
|
|
|
*
|
|
|
|
|
* <p>This class represents a binding that can be assigned to a
|
|
|
|
|
* keyboard key, a joystick button or axis, or even a panel
|
|
|
|
|
* instrument.</p>
|
|
|
|
|
*/
|
2003-05-13 03:18:42 +00:00
|
|
|
|
class FGBinding : public SGConditional
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Default constructor.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
FGBinding ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convenience constructor.
|
|
|
|
|
*
|
|
|
|
|
* @param node The binding will be built from this node.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
FGBinding (const SGPropertyNode * node);
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destructor.
|
|
|
|
|
*/
|
2005-06-20 18:52:45 +00:00
|
|
|
|
virtual ~FGBinding ();
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the command name.
|
|
|
|
|
*
|
|
|
|
|
* @return The string name of the command for this binding.
|
|
|
|
|
*/
|
2001-06-01 17:51:09 +00:00
|
|
|
|
virtual const string &getCommandName () const { return _command_name; }
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the command itself.
|
|
|
|
|
*
|
|
|
|
|
* @return The command associated with this binding, or 0 if none
|
|
|
|
|
* is present.
|
|
|
|
|
*/
|
2001-06-01 17:51:09 +00:00
|
|
|
|
virtual SGCommandMgr::command_t getCommand () const { return _command; }
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
2001-06-01 17:51:09 +00:00
|
|
|
|
virtual const SGPropertyNode * getArg () { return _arg; }
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Read a binding from a property node.
|
|
|
|
|
*
|
|
|
|
|
* @param node The property node containing the binding.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
virtual void read (const SGPropertyNode * node);
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Fire a binding.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
virtual void fire () const;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
2002-03-26 13:45:44 +00:00
|
|
|
|
* Fire a binding with a scaled movement (rather than absolute position).
|
2002-03-23 23:16:13 +00:00
|
|
|
|
*/
|
2002-03-26 13:45:44 +00:00
|
|
|
|
virtual void fire (double offset, double max) const;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* 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;
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2002-12-22 19:57:09 +00:00
|
|
|
|
// just to be safe.
|
|
|
|
|
FGBinding (const FGBinding &binding);
|
|
|
|
|
|
2001-06-01 17:51:09 +00:00
|
|
|
|
string _command_name;
|
2003-01-18 16:25:50 +00:00
|
|
|
|
mutable SGCommandMgr::command_t _command;
|
2003-12-22 19:18:22 +00:00
|
|
|
|
mutable SGPropertyNode_ptr _arg;
|
2002-12-22 19:57:09 +00:00
|
|
|
|
mutable SGPropertyNode_ptr _setting;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// General input mapping support.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Generic input module.
|
|
|
|
|
*
|
|
|
|
|
* <p>This module is designed to handle input from multiple sources --
|
|
|
|
|
* keyboard, joystick, mouse, or even panel switches -- in a consistent
|
|
|
|
|
* way, and to allow users to rebind any of the actions at runtime.</p>
|
|
|
|
|
*/
|
2003-09-24 17:20:55 +00:00
|
|
|
|
class FGInput : public SGSubsystem
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2001-08-10 05:17:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Default constructor.
|
|
|
|
|
*/
|
|
|
|
|
FGInput ();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destructor.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
virtual ~FGInput();
|
|
|
|
|
|
|
|
|
|
//
|
2003-09-24 17:20:55 +00:00
|
|
|
|
// Implementation of SGSubsystem.
|
2001-05-23 22:59:40 +00:00
|
|
|
|
//
|
|
|
|
|
virtual void init ();
|
2004-06-24 02:08:38 +00:00
|
|
|
|
virtual void reinit ();
|
2005-06-11 14:26:11 +00:00
|
|
|
|
virtual void postinit ();
|
2002-05-11 16:28:50 +00:00
|
|
|
|
virtual void update (double dt);
|
2003-03-01 21:29:31 +00:00
|
|
|
|
virtual void suspend ();
|
|
|
|
|
virtual void resume ();
|
|
|
|
|
virtual bool is_suspended () const;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
|
|
|
|
|
2002-10-04 13:20:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* Control whether this is the default module to receive events.
|
|
|
|
|
*
|
|
|
|
|
* The first input module created will set itself as the default
|
|
|
|
|
* automatically.
|
|
|
|
|
*
|
|
|
|
|
* @param status true if this should be the default module for
|
|
|
|
|
* events, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
virtual void makeDefault (bool status = true);
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Handle a single keystroke.
|
|
|
|
|
*
|
2004-03-31 21:10:32 +00:00
|
|
|
|
* @param k The integer key code, see Main/fg_os.hxx
|
2001-05-23 22:59:40 +00:00
|
|
|
|
* @param modifiers Modifier keys pressed (bitfield).
|
|
|
|
|
* @param x The mouse x position at the time of keypress.
|
|
|
|
|
* @param y The mouse y position at the time of keypress.
|
|
|
|
|
*/
|
|
|
|
|
virtual void doKey (int k, int modifiers, int x, int y);
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* 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);
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
private:
|
2001-06-04 21:07:02 +00:00
|
|
|
|
// Constants
|
2001-06-12 05:16:57 +00:00
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
MAX_KEYS = 1024,
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
#ifdef WIN32
|
2001-06-12 05:16:57 +00:00
|
|
|
|
MAX_JOYSTICKS = 2,
|
2001-06-04 21:07:02 +00:00
|
|
|
|
#else
|
2001-06-12 05:16:57 +00:00
|
|
|
|
MAX_JOYSTICKS = 10,
|
2001-06-04 21:07:02 +00:00
|
|
|
|
#endif
|
2002-03-23 23:16:13 +00:00
|
|
|
|
MAX_JOYSTICK_AXES = _JS_MAX_AXES,
|
|
|
|
|
MAX_JOYSTICK_BUTTONS = 32,
|
|
|
|
|
|
|
|
|
|
MAX_MICE = 1,
|
2002-03-26 13:45:44 +00:00
|
|
|
|
MAX_MOUSE_BUTTONS = 8
|
2001-06-12 05:16:57 +00:00
|
|
|
|
};
|
2002-03-30 12:52:55 +00:00
|
|
|
|
struct mouse;
|
|
|
|
|
friend struct mouse;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
2001-08-03 00:19:19 +00:00
|
|
|
|
typedef vector<FGBinding *> binding_list_t;
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a key or button.
|
|
|
|
|
*/
|
|
|
|
|
struct button {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
button ();
|
|
|
|
|
virtual ~button ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
bool is_repeatable;
|
2003-07-02 19:21:11 +00:00
|
|
|
|
float interval_sec;
|
|
|
|
|
float last_dt;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
int last_state;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t bindings[KEYMOD_MAX];
|
2001-06-04 21:07:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Settings for a single joystick axis.
|
|
|
|
|
*/
|
|
|
|
|
struct axis {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
axis ();
|
|
|
|
|
virtual ~axis ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
float last_value;
|
|
|
|
|
float tolerance;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t bindings[KEYMOD_MAX];
|
2001-06-20 20:51:15 +00:00
|
|
|
|
float low_threshold;
|
|
|
|
|
float high_threshold;
|
|
|
|
|
struct button low;
|
|
|
|
|
struct button high;
|
2003-07-01 16:32:00 +00:00
|
|
|
|
float interval_sec;
|
|
|
|
|
double last_dt;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Settings for a joystick.
|
|
|
|
|
*/
|
|
|
|
|
struct joystick {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
joystick ();
|
|
|
|
|
virtual ~joystick ();
|
|
|
|
|
int jsnum;
|
|
|
|
|
jsJoystick * js;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
int naxes;
|
|
|
|
|
int nbuttons;
|
|
|
|
|
axis * axes;
|
|
|
|
|
button * buttons;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a mouse mode.
|
|
|
|
|
*/
|
|
|
|
|
struct mouse_mode {
|
|
|
|
|
mouse_mode ();
|
|
|
|
|
virtual ~mouse_mode ();
|
|
|
|
|
int cursor;
|
|
|
|
|
bool constrained;
|
2002-03-26 17:14:48 +00:00
|
|
|
|
bool pass_through;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
button * buttons;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t x_bindings[KEYMOD_MAX];
|
|
|
|
|
binding_list_t y_bindings[KEYMOD_MAX];
|
2002-03-26 13:45:44 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a mouse.
|
|
|
|
|
*/
|
|
|
|
|
struct mouse {
|
|
|
|
|
mouse ();
|
|
|
|
|
virtual ~mouse ();
|
2002-03-26 13:45:44 +00:00
|
|
|
|
int x;
|
|
|
|
|
int y;
|
2002-03-27 23:45:11 +00:00
|
|
|
|
SGPropertyNode * mode_node;
|
|
|
|
|
SGPropertyNode * mouse_button_nodes[MAX_MOUSE_BUTTONS];
|
2002-03-25 12:58:26 +00:00
|
|
|
|
int nModes;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
int current_mode;
|
2004-06-14 18:46:58 +00:00
|
|
|
|
double timeout;
|
|
|
|
|
int save_x;
|
|
|
|
|
int save_y;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse_mode * modes;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize key bindings.
|
|
|
|
|
*/
|
|
|
|
|
void _init_keyboard ();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialize joystick bindings.
|
|
|
|
|
*/
|
|
|
|
|
void _init_joystick ();
|
|
|
|
|
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
/**
|
|
|
|
|
* Scan directory recursively for "named joystick" configuration files,
|
|
|
|
|
* and read them into /input/joysticks/js-named[index]++.
|
|
|
|
|
*/
|
|
|
|
|
void _scan_joystick_dir (SGPath *path, SGPropertyNode* node, int *index);
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize mouse bindings.
|
|
|
|
|
*/
|
|
|
|
|
void _init_mouse ();
|
|
|
|
|
|
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize a single button.
|
|
|
|
|
*/
|
|
|
|
|
inline void _init_button (const SGPropertyNode * node,
|
|
|
|
|
button &b,
|
|
|
|
|
const string name);
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize nasal parts that had to wait for the nasal to get
|
|
|
|
|
* functional.
|
|
|
|
|
*/
|
|
|
|
|
void _postinit_joystick ();
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update the keyboard.
|
|
|
|
|
*/
|
2003-06-04 14:22:51 +00:00
|
|
|
|
void _update_keyboard ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update the joystick.
|
|
|
|
|
*/
|
2003-07-01 16:32:00 +00:00
|
|
|
|
void _update_joystick (double dt);
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update the mouse.
|
|
|
|
|
*/
|
2004-06-14 18:46:58 +00:00
|
|
|
|
void _update_mouse (double dt);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update a single button.
|
|
|
|
|
*/
|
2002-03-23 23:16:13 +00:00
|
|
|
|
inline void _update_button (button &b, int modifiers, bool pressed,
|
|
|
|
|
int x, int y);
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Read bindings and modifiers.
|
|
|
|
|
*/
|
|
|
|
|
void _read_bindings (const SGPropertyNode * node,
|
|
|
|
|
binding_list_t * binding_list,
|
|
|
|
|
int modifiers);
|
|
|
|
|
|
2001-05-29 22:06:14 +00:00
|
|
|
|
/**
|
|
|
|
|
* Look up the bindings for a key code.
|
|
|
|
|
*/
|
2001-08-03 00:19:19 +00:00
|
|
|
|
const vector<FGBinding *> &_find_key_bindings (unsigned int k,
|
|
|
|
|
int modifiers);
|
2001-05-29 22:06:14 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
button _key_bindings[MAX_KEYS];
|
|
|
|
|
joystick _joystick_bindings[MAX_JOYSTICKS];
|
2002-03-23 23:16:13 +00:00
|
|
|
|
mouse _mouse_bindings[MAX_MICE];
|
|
|
|
|
|
- fix bug that let <mod-up> bindings be executed before the nasal init
block (this required to move most of init() into postinit())
- undo the "which" pseudo-namespace workaround, and do it proper:
- let all nasal code in a joystick config file be executed in its own
namespace. This allows to define functions in the init block that
can be used throughout the driver file, and to write state variables
in one binding, while reading them in other bindings, all without
having to make sure that the values aren't lost in between, or collide
with another joystick driver's code.
For this the input subsystem creates a namespace for each joystick:
"__js0" for joystick 0, etc. The two leading underscores are there to
avoid collisions with user defined modules (similar to internal compiler
variables). The namespace shouldn't be used explicitly, at least not in
releases, and not from outside code, except for testing purposes, for
which it can be useful. (If using the Cyborg joystick as js[0], you
can read the modifier level as "__js0.modifier" from any nasal context.)
2005-06-19 17:23:41 +00:00
|
|
|
|
/**
|
|
|
|
|
* Nasal module name/namespace.
|
|
|
|
|
*/
|
|
|
|
|
char _module[32];
|
2001-05-23 22:59:40 +00:00
|
|
|
|
};
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
#endif // _INPUT_HXX
|