#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
-#include <poll.h>
-#include <linux/input.h>
-#include <dbus/dbus.h>
-#include <fcntl.h>
#include "FGLinuxEventInput.hxx"
+#include <libudev.h>
#include <poll.h>
#include <linux/input.h>
-#include <dbus/dbus.h>
#include <fcntl.h>
#include <string.h>
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_ALERT, "name=" << (name?name:"<null>") << ", node=" << (node?node:"<null>"));
+ 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);
}