-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <msp/core/except.h>
+#include <sigc++/bind_return.h>
#include <msp/strings/lexicalcast.h>
#include "control.h"
#include "device.h"
+using namespace std;
+
namespace Msp {
namespace Input {
{
if(type==BUTTON)
return dev->get_button_name(index);
- else if(type==AXIS_POS || type==AXIS_NEG)
- return dev->get_axis_name(index);
+ else if(type==AXIS_POS)
+ return dev->get_axis_name(index)+" +";
+ else if(type==AXIS_NEG)
+ return dev->get_axis_name(index)+" -";
else if(type==NONE)
return "None";
- return lexical_cast(index);
+ return lexical_cast<string>(index);
}
connect_signals();
}
-Control::Control(const Control &c):
- trackable(c),
- src(c.src),
- capture_dev(0)
+Control::~Control()
+{ }
+
+void Control::capture(Device &d)
{
- connect_signals();
+ notify_callbacks();
+ capture_dev = &d;
+ capture_dev->signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_press), false));
+ capture_dev->signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Control::axis_motion), false));
}
-Control &Control::operator=(const Control &c)
+void Control::cancel_capture()
{
notify_callbacks();
- src=c.src;
- capture_dev=0;
+ capture_dev = 0;
connect_signals();
-
- return *this;
}
-void Control::capture(Device &d)
+void Control::set_source(Device &d, ControlSrcType t, unsigned i)
{
- notify_callbacks();
- capture_dev=&d;
- capture_dev->signal_button_press.connect(sigc::mem_fun(this, &Control::button_press));
- capture_dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
+ set_source(ControlSource(d, t, i));
}
-void Control::cancel_capture()
+void Control::set_source(const ControlSource &s)
{
notify_callbacks();
- capture_dev=0;
+ src = s;
connect_signals();
}
case NONE:
break;
case BUTTON:
- src.dev->signal_button_press.connect(sigc::mem_fun(this, &Control::button_press));
- src.dev->signal_button_release.connect(sigc::mem_fun(this, &Control::button_release));
+ src.dev->signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_press), false));
+ src.dev->signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_release), false));
break;
case AXIS_POS:
case AXIS_NEG:
- src.dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
+ src.dev->signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Control::axis_motion), false));
break;
- default:
- throw Exception("Invalid source in Control");
}
}
{
if(capture_dev)
{
- src.dev=capture_dev;
- src.type=BUTTON;
- src.index=i;
+ src.dev = capture_dev;
+ src.type = BUTTON;
+ src.index = i;
notify_callbacks();
- capture_dev=0;
+ capture_dev = 0;
connect_signals();
signal_capture_complete.emit();
}
{
if(capture_dev)
{
- ControlSrcType type=NONE;
- if(v<-src.dev->get_axis_threshold())
- type=AXIS_NEG;
- else if(v>src.dev->get_axis_threshold())
- type=AXIS_POS;
+ ControlSrcType type = NONE;
+ if(v<-0.9)
+ type = AXIS_NEG;
+ else if(v>0.9)
+ type = AXIS_POS;
if(type!=NONE)
{
- src.dev=capture_dev;
- src.type=type;
- src.index=i;
+ src.dev = capture_dev;
+ src.type = type;
+ src.index = i;
notify_callbacks();
- capture_dev=0;
+ capture_dev = 0;
connect_signals();
signal_capture_complete.emit();
}