//
// $Id$
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include "FGJoystickInput.hxx"
+
+#include <simgear/props/props_io.hxx>
#include "FGDeviceConfigurationMap.hxx"
#include <Main/fg_props.hxx>
#include <Scripting/NasalSys.hxx>
naxes(0),
nbuttons(0),
axes(0),
- buttons(0)
+ buttons(0),
+ predefined(true)
{
}
FGJoystickInput::joystick::~joystick ()
{
-// delete js? why not?
-// delete js;
+ // delete js? no, since js == this - and we're in the destructor already.
delete[] axes;
delete[] buttons;
+ jsnum = 0;
+ js = NULL;
+ naxes = 0;
+ nbuttons = 0;
+ axes = NULL;
+ buttons = NULL;
}
FGJoystickInput::~FGJoystickInput()
{
+ _remove(true);
}
+void FGJoystickInput::_remove(bool all)
+{
+ SGPropertyNode * js_nodes = fgGetNode("/input/joysticks", true);
+
+ for (int i = 0; i < MAX_JOYSTICKS; i++)
+ {
+ // do not remove predefined joysticks info on reinit
+ if ((all)||(!bindings[i].predefined))
+ js_nodes->removeChild("js", i, false);
+ if (bindings[i].js)
+ delete bindings[i].js;
+ bindings[i].js = NULL;
+ }
+}
void FGJoystickInput::init()
{
jsInit();
- // TODO: zero the old bindings first.
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing joystick bindings");
- SGPropertyNode * js_nodes = fgGetNode("/input/joysticks", true);
+ SGPropertyNode_ptr js_nodes = fgGetNode("/input/joysticks", true);
FGDeviceConfigurationMap configMap("Input/Joysticks", js_nodes, "js-named");
SG_LOG(SG_INPUT, SG_INFO, "Using existing bindings for joystick " << i);
} else {
+ bindings[i].predefined = false;
SG_LOG(SG_INPUT, SG_INFO, "Looking for bindings for joystick \"" << name << '"');
SGPropertyNode_ptr named;
void FGJoystickInput::reinit() {
SG_LOG(SG_INPUT, SG_DEBUG, "Re-Initializing joystick bindings");
- SGPropertyNode * js_nodes = fgGetNode("/input/joysticks", true);
- js_nodes->removeChildren("js", false);
+ _remove(false);
FGJoystickInput::init();
FGJoystickInput::postinit();
}
//
// Initialize nasal groups.
//
- ostringstream str;
+ std::ostringstream str;
str << "__js" << i;
string module = str.str();
nasalsys->createModule(module.c_str(), module.c_str(), "", 0);
if (num_node != 0) {
n_axis = num_node->getIntValue(TGT_PLATFORM, -1);
+ #ifdef SG_MAC
+ // Mac falls back to Unix by default - avoids specifying many
+ // duplicate <mac> entries in joystick config files
+ if (n_axis < 0) {
+ n_axis = num_node->getIntValue("unix", -1);
+ }
+ #endif
+
// Silently ignore platforms that are not specified within the
// <number></number> section
- if (n_axis < 0)
- continue;
+ if (n_axis < 0) {
+ continue;
+ }
}
if (n_axis >= naxes) {
// Do nothing if the axis position
// is unchanged; only a change in
// position fires the bindings.
- if (fabs(axis_values[j] - a.last_value) > a.tolerance) {
+ // But only if there are bindings
+ if (fabs(axis_values[j] - a.last_value) > a.tolerance
+ && a.bindings[KEYMOD_NONE].size() > 0 ) {
a.last_value = axis_values[j];
for (unsigned int k = 0; k < a.bindings[KEYMOD_NONE].size(); k++)
a.bindings[KEYMOD_NONE][k]->fire(axis_values[j]);
FGButton &b = bindings[i].buttons[j];
b.last_dt += dt;
if(b.last_dt >= b.interval_sec) {
- bindings[i].buttons[j].update( modifiers, (buttons & (1 << j)) > 0 );
+ bindings[i].buttons[j].update( modifiers, (buttons & (1u << j)) > 0 );
b.last_dt -= b.interval_sec;
}
}