try and handle peoples thinkpads where acpid reports different event
authorCarsten Haitzler <raster@rasterman.com>
Mon, 21 May 2012 07:40:04 +0000 (07:40 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 21 May 2012 07:40:04 +0000 (07:40 +0000)
formasts.

e.g.:
    button/lid LID close
  as opposed to
    button/lid LID0 00000080 00000001

i hope normal acpi isn't broken. please test.

SVN revision: 71268

src/bin/e_acpi.c

index b815fcd..b41b1da 100644 (file)
@@ -209,68 +209,74 @@ _e_acpi_cb_server_data(void *data __UNUSED__, int type __UNUSED__, void *event)
         sdata[p - str] = 0;
         /* parse out this acpi string into separate pieces */
         if (sscanf(sdata, "%1023s %1023s %x %x", 
-                   device, bus, &sig, &status) == 4)
+                   device, bus, &sig, &status) != 4)
           {
-             /* create new event structure to raise */
-             acpi_event = E_NEW(E_Event_Acpi, 1);
-             acpi_event->bus_id = eina_stringshare_add(bus);
-             acpi_event->signal = sig;
-             acpi_event->status = status;
-             
-             /* FIXME: add in a key faking layer */
-             if (!done)
-               {
-                  for (i = 0; _devices_multiplexed[i].name; i++)
-                    {
-                       // if device name matches
-                       if ((!strcmp(device, _devices_multiplexed[i].name)) &&
-                           // AND busname not set OR device name matches
-                           (!_devices_multiplexed[i].bus ||
-                               (_devices_multiplexed[i].bus &&
-                                   (!strcmp(bus, _devices_multiplexed[i].bus)))) &&
-                           // AND status matches
-                           (_devices_multiplexed[i].status == status))
-                         {
-                            acpi_event->type = _devices_multiplexed[i].type;
-                            done = 1;
-                            break;
-                         }
-                    }
-               }
-             if (!done)
+             sig = -1;
+             status = -1;
+             if (sscanf(sdata, "%1023s %1023s", device, bus) != 2)
+               goto done_event;
+          }
+        
+        /* create new event structure to raise */
+        acpi_event = E_NEW(E_Event_Acpi, 1);
+        acpi_event->bus_id = eina_stringshare_add(bus);
+        acpi_event->signal = sig;
+        acpi_event->status = status;
+        
+        /* FIXME: add in a key faking layer */
+        if ((!done) && (sig >= 0) && (status >= 0))
+          {
+             for (i = 0; _devices_multiplexed[i].name; i++)
                {
                   // if device name matches
-                  for (i = 0; _devices_simple[i].name; i++)
+                  if ((!strcmp(device, _devices_multiplexed[i].name)) &&
+                      // AND busname not set OR device name matches
+                      (!_devices_multiplexed[i].bus ||
+                          (_devices_multiplexed[i].bus &&
+                              (!strcmp(bus, _devices_multiplexed[i].bus)))) &&
+                      // AND status matches
+                      (_devices_multiplexed[i].status == status))
                     {
-                       if (!strcmp(device, _devices_simple[i].name))
-                         {
-                            acpi_event->type = _devices_simple[i].type;
-                            done = 1;
-                            break;
-                         }
+                       acpi_event->type = _devices_multiplexed[i].type;
+                       done = 1;
+                       break;
                     }
                }
-             if (!done)
-               {
-                  free(acpi_event);
-                  acpi_event = NULL;
-               }
-             else
+          }
+        if (!done)
+          {
+             // if device name matches
+             for (i = 0; _devices_simple[i].name; i++)
                {
-                  switch (acpi_event->type)
+                  if (!strcmp(device, _devices_simple[i].name))
                     {
-                     case E_ACPI_TYPE_LID:
-                       acpi_event->status = 
-                          _e_acpi_lid_status_get(device, bus);
-                       break;
-                     default:
+                       acpi_event->type = _devices_simple[i].type;
+                       done = 1;
                        break;
                     }
-                  /* actually raise the event */
-                  ecore_event_add(E_EVENT_ACPI, acpi_event, 
-                                  _e_acpi_cb_event_free, NULL);
                }
           }
+        if (!done)
+          {
+             free(acpi_event);
+             acpi_event = NULL;
+          }
+        else
+          {
+             switch (acpi_event->type)
+               {
+                case E_ACPI_TYPE_LID:
+                  acpi_event->status = 
+                    _e_acpi_lid_status_get(device, bus);
+                  break;
+                default:
+                  break;
+               }
+             /* actually raise the event */
+             ecore_event_add(E_EVENT_ACPI, acpi_event, 
+                             _e_acpi_cb_event_free, NULL);
+          }
+done_event:
         str = p + 1;
         p = strchr(str, '\n');
      }