From b2183c7d51f6735ea67c5d8c319a05f26f883442 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Sat, 22 Mar 2008 21:40:30 +0000 Subject: Tracking of live axes (bzr r5172) --- src/device-manager.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'src/device-manager.cpp') diff --git a/src/device-manager.cpp b/src/device-manager.cpp index 9cf4583c6..dcf86edb7 100644 --- a/src/device-manager.cpp +++ b/src/device-manager.cpp @@ -50,6 +50,8 @@ public: virtual gint getNumKeys() const {return device->num_keys;} virtual Glib::ustring getLink() const {return link;} virtual void setLink( Glib::ustring const& link ) {this->link = link;} + virtual gint getLiveAxes() const {return liveAxes;} + virtual void setLiveAxes(gint axes) {liveAxes = axes;} virtual gint getLiveButtons() const {return liveButtons;} virtual void setLiveButtons(gint buttons) {liveButtons = buttons;} @@ -66,6 +68,7 @@ private: Glib::ustring name; Gdk::InputSource source; Glib::ustring link; + guint liveAxes; guint liveButtons; }; @@ -94,6 +97,7 @@ InputDeviceImpl::InputDeviceImpl(GdkDevice* device) name(device->name ? device->name : ""), source(static_cast(device->source)), link(), + liveAxes(0), liveButtons(0) { switch ( source ) { @@ -127,15 +131,18 @@ public: DeviceManagerImpl(); virtual std::list getDevices(); virtual sigc::signal& > signalDeviceChanged(); + virtual sigc::signal& > signalAxesChanged(); virtual sigc::signal& > signalButtonsChanged(); virtual sigc::signal& > signalLinkChanged(); + virtual void addAxis(Glib::ustring const & id, gint axis); virtual void addButton(Glib::ustring const & id, gint button); virtual void setLinkedTo(Glib::ustring const & id, Glib::ustring const& link); protected: std::list devices; sigc::signal& > signalDeviceChangedPriv; + sigc::signal& > signalAxesChangedPriv; sigc::signal& > signalButtonsChangedPriv; sigc::signal& > signalLinkChangedPriv; }; @@ -179,6 +186,11 @@ sigc::signal& > DeviceManagerImpl::signalD return signalDeviceChangedPriv; } +sigc::signal& > DeviceManagerImpl::signalAxesChanged() +{ + return signalAxesChangedPriv; +} + sigc::signal& > DeviceManagerImpl::signalButtonsChanged() { return signalButtonsChangedPriv; @@ -189,6 +201,23 @@ sigc::signal& > DeviceManagerImpl::signalL return signalLinkChangedPriv; } +void DeviceManagerImpl::addAxis(Glib::ustring const & id, gint axis) +{ + if ( axis >= 0 && axis < static_cast(bitVals.size()) ) { + std::list::iterator it = std::find_if(devices.begin(), devices.end(), IdMatcher(id)); + if ( it != devices.end() ) { + gint mask = bitVals[axis]; + if ( (mask & (*it)->getLiveAxes()) == 0 ) { + (*it)->setLiveAxes((*it)->getLiveAxes() | mask); + + // Only signal if a new axis was added + (*it)->reference(); + signalAxesChangedPriv.emit(Glib::RefPtr(*it)); + } + } + } +} + void DeviceManagerImpl::addButton(Glib::ustring const & id, gint button) { if ( button >= 0 && button < static_cast(bitVals.size()) ) { @@ -206,7 +235,6 @@ void DeviceManagerImpl::addButton(Glib::ustring const & id, gint button) } } - void DeviceManagerImpl::setLinkedTo(Glib::ustring const & id, Glib::ustring const& link) { std::list::iterator it = std::find_if(devices.begin(), devices.end(), IdMatcher(id)); -- cgit v1.2.3