X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fhub.cpp;h=1916126c9ff3f3be420de975bb3b93ea03ad9f55;hb=e82345f2c1286e684789854c7dbe32411bb0b05f;hp=4a2d5533aafeb36bea172bee347e0bd4d25ae184;hpb=b2d45380967cb2f682c3edfa6288b3d412507d5d;p=libs%2Fgui.git diff --git a/source/input/hub.cpp b/source/input/hub.cpp index 4a2d553..1916126 100644 --- a/source/input/hub.cpp +++ b/source/input/hub.cpp @@ -1,56 +1,88 @@ +#include "hub.h" #include #include +#include #include #include -#include "hub.h" using namespace std; namespace Msp { namespace Input { -Hub::Hub() +Hub::Hub(): + Device(UNSPECIFIED) { name = "Hub"; } void Hub::attach(Device &dev) { - unsigned tag = hash32(dev.get_name(), 20); - while(devices.count(tag)) - ++tag; + unsigned index = devices.size(); + devices.push_back(&dev); + dev.signal_button_press.connect(sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Hub::button_press), index), false)); + dev.signal_button_release.connect(sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Hub::button_release), index), false)); + dev.signal_axis_motion.connect(sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Hub::axis_motion), index), false)); +} - devices[tag] = &dev; - dev.signal_button_press.connect(sigc::bind(sigc::mem_fun(this, &Hub::button_press), tag)); - dev.signal_button_release.connect(sigc::bind(sigc::mem_fun(this, &Hub::button_release), tag)); - dev.signal_axis_motion.connect(sigc::bind(sigc::mem_fun(this, &Hub::axis_motion), tag)); +Device *Hub::find_subdevice(DeviceType t, unsigned n) +{ + for(Device *d: devices) + if(Device *dev = d->find_subdevice(t, 0)) + { + if(!n) + return dev; + --n; + } + return nullptr; } -std::string Hub::get_button_name(unsigned btn) const +Device *Hub::find_subdevice(const string &n) { - const Device &dev = *get_item(devices, btn>>12); - return dev.get_name()+": "+dev.get_button_name(btn&0xFFF); + if(n==name) + return this; + for(Device *d: devices) + if(Device *dev = d->find_subdevice(n)) + return dev; + return nullptr; } -std::string Hub::get_axis_name(unsigned axis) const +string Hub::get_button_name(unsigned btn) const { - const Device &dev = *get_item(devices, axis>>12); - return dev.get_name()+": "+dev.get_axis_name(axis&0xFFF); + unsigned dev_index = btn>>8; + if(dev_index>=devices.size()) + throw out_of_range("Hub::get_button_name"); + + const Device &dev = *devices[dev_index]; + return dev.get_name()+": "+dev.get_button_name(btn&0xFF); +} + +string Hub::get_axis_name(unsigned axis) const +{ + unsigned dev_index = axis>>8; + if(dev_index>=devices.size()) + throw out_of_range("Hub::get_axis_name"); + + const Device &dev = *devices[dev_index]; + return dev.get_name()+": "+dev.get_axis_name(axis&0xFF); } -void Hub::button_press(unsigned btn, unsigned tag) +void Hub::button_press(unsigned btn, unsigned index) { - set_button_state((tag<<12) | (btn&0xFFF), true, true); + if(btn<0x100) + set_button_state((index<<8) | btn, true, true); } -void Hub::button_release(unsigned btn, unsigned tag) +void Hub::button_release(unsigned btn, unsigned index) { - set_button_state((tag<<12) | (btn&0xFFF), false, true); + if(btn<0x100) + set_button_state((index<<8) | btn, false, true); } -void Hub::axis_motion(unsigned axis, float value, float, unsigned tag) +void Hub::axis_motion(unsigned axis, float value, float, unsigned index) { - set_axis_value((tag<<12) | (axis&0xFFF), value, true); + if(axis<0x100) + set_axis_value((index<<8) | axis, value, true); } } // namespace Input