X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGLinuxEventInput.cxx;h=43256aadd485a167c2042eb2c215d9e94f517bf6;hb=3d4806adbe6705f785fd950bd4b4afde1cb4f8d2;hp=4139dd7f547a8cb743629e25f7ddcb25f0c81818;hpb=1d887677b9a48dc33412bb428daec7083f1ee499;p=flightgear.git diff --git a/src/Input/FGLinuxEventInput.cxx b/src/Input/FGLinuxEventInput.cxx index 4139dd7f5..43256aadd 100644 --- a/src/Input/FGLinuxEventInput.cxx +++ b/src/Input/FGLinuxEventInput.cxx @@ -25,15 +25,11 @@ #include #include #include -#include -#include -#include -#include #include "FGLinuxEventInput.hxx" +#include #include #include -#include #include #include @@ -46,7 +42,7 @@ struct TypeCode { return (unsigned long)type << 16 | (unsigned long)code; } - bool operator < ( const TypeCode other) const { + bool operator < ( const TypeCode & other) const { return hashCode() < other.hashCode(); } }; @@ -225,7 +221,7 @@ static struct enbet { }; -class EventNameByEventType : public map { +class EventNameByEventType : public std::map { public: EventNameByEventType() { for( unsigned i = 0; i < sizeof(EVENT_NAMES_BY_EVENT_TYPE)/sizeof(EVENT_NAMES_BY_EVENT_TYPE[0]); i++ ) @@ -234,7 +230,7 @@ public: }; static EventNameByEventType EVENT_NAME_BY_EVENT_TYPE; -class EventNameByType : public map { +class EventNameByType : public std::map { public: EventNameByType() { for( unsigned i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ ) @@ -246,11 +242,11 @@ static EventNameByType EVENT_NAME_BY_TYPE; struct ltstr { bool operator()(const char * s1, const char * s2 ) const { - return string(s1).compare( s2 ) < 0; + return std::string(s1).compare( s2 ) < 0; } }; -class EventTypeByName : public map { +class EventTypeByName : public std::map { public: EventTypeByName() { for( unsigned i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ ) @@ -260,7 +256,7 @@ public: static EventTypeByName EVENT_TYPE_BY_NAME; -FGLinuxInputDevice::FGLinuxInputDevice( string aName, string aDevname ) : +FGLinuxInputDevice::FGLinuxInputDevice( std::string aName, std::string aDevname ) : FGInputDevice(aName), devname( aDevname ), fd(-1) @@ -290,7 +286,7 @@ void FGLinuxInputDevice::Open() { if( fd != -1 ) return; if( (fd = ::open( devname.c_str(), O_RDWR )) == -1 ) { - throw exception(); + throw std::exception(); } if( GetGrab() && ioctl( fd, EVIOCGRAB, 2 ) == -1 ) { @@ -311,6 +307,7 @@ void FGLinuxInputDevice::Open() continue; } absinfo[i] = ai; +/* SG_LOG( SG_INPUT, SG_INFO, "Axis #" << i << ": value=" << ai.value << ": minimum=" << ai.minimum << @@ -318,6 +315,7 @@ void FGLinuxInputDevice::Open() ": fuzz=" << ai.fuzz << ": flat=" << ai.flat << ": resolution=" << ai.resolution ); +*/ // kick an initial event struct input_event event; @@ -438,97 +436,47 @@ const char * FGLinuxInputDevice::TranslateEventName( FGEventData & eventData ) return EVENT_NAME_BY_TYPE[typeCode]; } -void FGLinuxInputDevice::SetDevname( string name ) +void FGLinuxInputDevice::SetDevname( const std::string & name ) { this->devname = name; } -FGLinuxEventInput::FGLinuxEventInput() : - halcontext(NULL) +FGLinuxEventInput::FGLinuxEventInput() { } FGLinuxEventInput::~FGLinuxEventInput() { - if( halcontext != NULL ) { - libhal_ctx_shutdown( halcontext, NULL); - libhal_ctx_free( halcontext ); - halcontext = NULL; - } -} - -#if 0 -//TODO: enable hotplug support -static void DeviceAddedCallback (LibHalContext *ctx, const char *udi) -{ - FGLinuxEventInput * linuxEventInput = (FGLinuxEventInput*)libhal_ctx_get_user_data (ctx); - linuxEventInput->AddHalDevice( udi ); } -static void DeviceRemovedCallback (LibHalContext *ctx, const char *udi) -{ -} -#endif - void FGLinuxEventInput::postinit() { FGEventInput::postinit(); - DBusConnection * connection; - DBusError dbus_error; - - dbus_error_init(&dbus_error); - connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error); - if (dbus_error_is_set(&dbus_error)) { - SG_LOG( SG_INPUT, SG_ALERT, "Can't connect to system bus " << dbus_error.message); - dbus_error_free (&dbus_error); - return; - } - - halcontext = libhal_ctx_new(); - - libhal_ctx_set_dbus_connection (halcontext, connection ); - dbus_error_init (&dbus_error); - - if( libhal_ctx_init( halcontext, &dbus_error )) { + struct udev * udev = udev_new(); - int num_devices = 0; - char ** devices = libhal_find_device_by_capability(halcontext, "input", &num_devices, NULL); + struct udev_enumerate *enumerate = udev_enumerate_new(udev); + udev_enumerate_add_match_subsystem(enumerate, "input"); + udev_enumerate_scan_devices(enumerate); + struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); + struct udev_list_entry *dev_list_entry; - for ( int i = 0; i < num_devices; i++) - AddHalDevice( devices[i] ); + udev_list_entry_foreach(dev_list_entry, devices) { + const char * path = udev_list_entry_get_name(dev_list_entry); + struct udev_device *dev = udev_device_new_from_syspath(udev, path); + const char * node = udev_device_get_devnode(dev); + + dev = udev_device_get_parent( dev ); + const char * name = udev_device_get_sysattr_value(dev,"name"); - libhal_free_string_array (devices); - -//TODO: enable hotplug support -// libhal_ctx_set_user_data( halcontext, this ); -// libhal_ctx_set_device_added( halcontext, DeviceAddedCallback ); -// libhal_ctx_set_device_removed( halcontext, DeviceRemovedCallback ); - } else { - if(dbus_error_is_set (&dbus_error) ) { - SG_LOG( SG_INPUT, SG_ALERT, "Can't connect to hald: " << dbus_error.message); - dbus_error_free (&dbus_error); - } else { - SG_LOG( SG_INPUT, SG_ALERT, "Can't connect to hald." ); - } + SG_LOG(SG_INPUT,SG_DEBUG, "name=" << (name?name:"") << ", node=" << (node?node:"")); + if( name && node ) + AddDevice( new FGLinuxInputDevice(name, node) ); - libhal_ctx_free (halcontext); - halcontext = NULL; - } -} - -void FGLinuxEventInput::AddHalDevice( const char * udi ) -{ - char * device = libhal_device_get_property_string( halcontext, udi, "input.device", NULL); - char * product = libhal_device_get_property_string( halcontext, udi, "input.product", NULL); - - if( product != NULL && device != NULL ) - AddDevice( new FGLinuxInputDevice(product, device) ); - else - SG_LOG( SG_INPUT, SG_ALERT, "Can't get device or product property of " << udi ); + udev_device_unref(dev); + } - if( device != NULL ) libhal_free_string( device ); - if( product != NULL ) libhal_free_string( product ); + udev_unref(udev); } @@ -538,8 +486,8 @@ void FGLinuxEventInput::update( double dt ) // index the input devices by the associated fd and prepare // the pollfd array by filling in the file descriptor struct pollfd fds[input_devices.size()]; - map devicesByFd; - map::const_iterator it; + std::map devicesByFd; + std::map::const_iterator it; int i; for( i=0, it = input_devices.begin(); it != input_devices.end(); ++it, i++ ) { FGInputDevice* p = (*it).second;