]> git.mxchange.org Git - flightgear.git/blobdiff - src/Input/FGLinuxEventInput.cxx
fix a pointer reference.
[flightgear.git] / src / Input / FGLinuxEventInput.cxx
index b0de0d617893720090ef7d5f8fdc6dc9664e938b..382a99c8aa0d2b9c5ef51997ae0d26a72e66d795 100644 (file)
@@ -174,9 +174,15 @@ static struct EventTypes {
   { { EV_SW, SW_LID },               "switch-lid" },
   { { EV_SW, SW_TABLET_MODE },       "switch-tablet-mode" },
   { { EV_SW, SW_HEADPHONE_INSERT },  "switch-headphone-insert" },
+#ifdef SW_RFKILL_ALL 
   { { EV_SW, SW_RFKILL_ALL },        "switch-rfkill" },
+#endif
+#ifdef SW_MICROPHONE_INSERT 
   { { EV_SW, SW_MICROPHONE_INSERT }, "switch-microphone-insert" },
-  { { EV_SW, SW_DOCK },              "swtich-dock" },
+#endif
+#ifdef SW_DOCK
+  { { EV_SW, SW_DOCK },              "switch-dock" },
+#endif
 
   { { EV_LED, LED_NUML},     "led-numlock" },
   { { EV_LED, LED_CAPSL},    "led-capslock" },
@@ -192,10 +198,38 @@ static struct EventTypes {
 
 };
 
+static struct enbet {
+  unsigned type;
+  const char * name;
+} EVENT_NAMES_BY_EVENT_TYPE[] = {
+  { EV_SYN, "syn" },
+  { EV_KEY, "button" },
+  { EV_REL, "rel" },
+  { EV_ABS, "abs" },
+  { EV_MSC, "msc" },
+  { EV_SW, "button" },
+  { EV_LED, "led" },
+  { EV_SND, "snd" },
+  { EV_REP, "rep" },
+  { EV_FF, "ff" },
+  { EV_PWR, "pwr" },
+  { EV_FF_STATUS, "ff-status" }
+};
+
+
+class EventNameByEventType : public map<unsigned,const char*> {
+public:
+  EventNameByEventType() {
+    for( unsigned i = 0; i < sizeof(EVENT_NAMES_BY_EVENT_TYPE)/sizeof(EVENT_NAMES_BY_EVENT_TYPE[0]); i++ )
+      (*this)[EVENT_NAMES_BY_EVENT_TYPE[i].type] = EVENT_NAMES_BY_EVENT_TYPE[i].name;
+  }
+};
+static EventNameByEventType EVENT_NAME_BY_EVENT_TYPE;
+
 class EventNameByType : public map<TypeCode,const char*> {
 public:
   EventNameByType() {
-    for( int i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ )
+    for( unsigned i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ )
       (*this)[EVENT_TYPES[i].typeCode] = EVENT_TYPES[i].name;
   }
 };
@@ -211,7 +245,7 @@ struct ltstr {
 class EventTypeByName : public map<const char *,TypeCode,ltstr> {
 public:
   EventTypeByName() {
-    for( int i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ )
+    for( unsigned i = 0; i < sizeof(EVENT_TYPES)/sizeof(EVENT_TYPES[0]); i++ )
       (*this)[EVENT_TYPES[i].name] = EVENT_TYPES[i].typeCode;
   }
 };
@@ -220,9 +254,8 @@ static EventTypeByName EVENT_TYPE_BY_NAME;
 
 FGLinuxInputDevice::FGLinuxInputDevice( string aName, string aDevname ) :
   FGInputDevice(aName),
-  fd(-1),
-  devname( aDevname )
-
+  devname( aDevname ),
+  fd(-1)
 {
 }
 
@@ -246,20 +279,20 @@ void FGLinuxInputDevice::Open()
   if( (fd = ::open( devname.c_str(), O_RDWR )) == -1 ) { 
     throw exception();
   }
-/*
-  input_event evt;
-  evt.type=EV_LED;
-  evt.code = 8;
-  evt.value = 1;
-  evt.time.tv_sec = 0;
-  evt.time.tv_usec = 0;
-  write( fd, &evt, sizeof(evt) );
-*/
+
+  if( GetGrab() && ioctl( fd, EVIOCGRAB, 2 ) != 0 ) {
+    SG_LOG( SG_INPUT, SG_WARN, "Can't grab " << devname << " for exclusive access" );
+  }
 }
 
 void FGLinuxInputDevice::Close()
 {
-  if( fd != -1 ) ::close(fd);
+  if( fd != -1 ) {
+    if( GetGrab() && ioctl( fd, EVIOCGRAB, 0 ) != 0 ) {
+      SG_LOG( SG_INPUT, SG_WARN, "Can't ungrab " << devname );
+    }
+    ::close(fd);
+  }
   fd = -1;
 }
 
@@ -294,7 +327,13 @@ const char * FGLinuxInputDevice::TranslateEventName( FGEventData & eventData )
   typeCode.type = linuxEventData.type;
   typeCode.code = linuxEventData.code;
   if( EVENT_NAME_BY_TYPE.count(typeCode) == 0 ) {
-    sprintf( ugly_buffer, "unknown-%u-%u", (unsigned)linuxEventData.type, (unsigned)linuxEventData.code );
+    // event not known in translation tables
+    if( EVENT_NAME_BY_EVENT_TYPE.count(linuxEventData.type) == 0 ) {
+      // event type not known in translation tables
+      sprintf( ugly_buffer, "unknown-%u-%u", (unsigned)linuxEventData.type, (unsigned)linuxEventData.code );
+      return ugly_buffer;
+    }
+    sprintf( ugly_buffer, "%s-%u", EVENT_NAME_BY_EVENT_TYPE[linuxEventData.type], (unsigned)linuxEventData.code );
     return ugly_buffer;
   }
 
@@ -333,9 +372,9 @@ static void DeviceRemovedCallback (LibHalContext *ctx, const char *udi)
 }
 #endif
 
-void FGLinuxEventInput::init()
+void FGLinuxEventInput::postinit()
 {
-  FGEventInput::init();
+  FGEventInput::postinit();
 
   DBusConnection * connection;
   DBusError dbus_error;
@@ -418,7 +457,7 @@ void FGLinuxEventInput::update( double dt )
   // do no more than maxpolls in a single loop to prevent locking
   int maxpolls = 100;
   while( maxpolls-- > 0 && ::poll( fds, i, 0 ) > 0 ) {
-    for( int i = 0; i < sizeof(fds)/sizeof(fds[0]); i++ ) {
+    for( unsigned i = 0; i < sizeof(fds)/sizeof(fds[0]); i++ ) {
       if( fds[i].revents & POLLIN ) {
 
         // if this device reports data ready, it should be a input_event struct