2
0
Эх сурвалжийг харах

blacklisting virtual devices

Karim Ahmed 13 жил өмнө
parent
commit
38d03b192c

+ 85 - 57
gameplay/src/PlatformLinux.cpp

@@ -766,57 +766,40 @@ namespace gameplay
     }
     }
 
 
 
 
-    bool isGamepadDevRegistered(dev_t devId)
-    {
-        for(list<ConnectedGamepadDevInfo>::iterator it = __connectedGamepads.begin(); it != __connectedGamepads.end();++it)
-        {
-            if(devId == (*it).deviceId) return true;
-        }
-        return false;
-    }
-
-    void unregisterGamepad(GamepadHandle handle)
-    {
-        for(list<ConnectedGamepadDevInfo>::iterator it = __connectedGamepads.begin(); it != __connectedGamepads.end();++it)
-        {
-            if(handle == (*it).fd)
-            {
-                __connectedGamepads.erase(it);
-                return;
-            }
-        }
-    }
-
     //Will need to be dynamic, also should be handled in Gamepad class
     //Will need to be dynamic, also should be handled in Gamepad class
     static const GamepadInfoEntry gamepadLookupTable[] = 
     static const GamepadInfoEntry gamepadLookupTable[] = 
     {
     {
-        {0x0,0x0,"GENERIC XBOX360",2,6,12,2, 
+        {0x0,0x0,"GENERIC XBOX360",2,6,20,2, 
                                              (GamepadJoystickAxisInfo[]) {
                                              (GamepadJoystickAxisInfo[]) {
-                                                                             {0,0, GP_AXIS_IS_XAXIS,0,0,2240,NEG_TO_POS},
-                                                                             {1,0,GP_AXIS_IS_NEG,0,0,2240,NEG_TO_POS},
-                                                                             {3,1,GP_AXIS_IS_XAXIS,0,0,2240,NEG_TO_POS},
-                                                                             {4,1,GP_AXIS_IS_NEG,0,0,2240,NEG_TO_POS},
-                                                                             {5,2,GP_AXIS_IS_DPAD, Gamepad::BUTTON_RIGHT, Gamepad::BUTTON_LEFT,2240,NEG_TO_POS},
-                                                                             {6,2,GP_AXIS_IS_DPAD, Gamepad::BUTTON_DOWN, Gamepad::BUTTON_UP,2240,NEG_TO_POS},
-                                                                             {-1,0,0,0,0,0,NEG_TO_POS}
-                                                                         },
+                                                                     {0,0,GP_AXIS_IS_XAXIS,0,0,2240,NEG_TO_POS},
+                                                                     {1,0,GP_AXIS_IS_NEG,0,0,2240,NEG_TO_POS},
+                                                                     {2,1,GP_AXIS_IS_XAXIS,0,0,2240,NEG_TO_POS},
+                                                                     {3,1,GP_AXIS_IS_NEG,0,0,2240,NEG_TO_POS},
+                                                                     {4,2,GP_AXIS_IS_TRIGGER,0,0,2240,ZERO_TO_POS},
+                                                                     {5,2,GP_AXIS_IS_TRIGGER,1,0,2240,ZERO_TO_POS},
+                                                                     {-1,0,0,0,0,0,NEG_TO_POS}
+                                                                 },
                                              (long[]) {
                                              (long[]) {
-                                                                          Gamepad::BUTTON_UP,    
-                                                                          Gamepad::BUTTON_DOWN,  
-                                                                          Gamepad::BUTTON_LEFT,  
-                                                                          Gamepad::BUTTON_RIGHT, 
-                                                                          Gamepad::BUTTON_MENU2, 
-                                                                          Gamepad::BUTTON_MENU1, 
-                                                                          Gamepad::BUTTON_L3,    
-                                                                          Gamepad::BUTTON_R3,   
-                                                                          Gamepad::BUTTON_L1,   
-                                                                          Gamepad::BUTTON_R1,   
-                                                                          0,
-                                                                          0,
-                                                                          Gamepad::BUTTON_A,   
-                                                                          Gamepad::BUTTON_B,   
-                                                                          Gamepad::BUTTON_X,   
-                                                                          Gamepad::BUTTON_Y   
+                                                                          -1,    
+                                                                          -1,  
+                                                                          -1,  
+                                                                          -1, 
+                                                                          -1, 
+                                                                          Gamepad::BUTTON_UP,
+                                                                          Gamepad::BUTTON_DOWN,
+                                                                          Gamepad::BUTTON_LEFT,
+                                                                          Gamepad::BUTTON_RIGHT,
+                                                                          Gamepad::BUTTON_MENU2,
+                                                                          Gamepad::BUTTON_MENU1,
+                                                                          Gamepad::BUTTON_L3,
+                                                                          Gamepad::BUTTON_R3,
+                                                                          Gamepad::BUTTON_L1,
+                                                                          Gamepad::BUTTON_R1,
+                                                                          Gamepad::BUTTON_MENU3,
+                                                                          Gamepad::BUTTON_A,
+                                                                          Gamepad::BUTTON_B,
+                                                                          Gamepad::BUTTON_X,
+                                                                          Gamepad::BUTTON_Y
                                                                          }
                                                                          }
         },
         },
         {0x79,0x6,"DragonRise Inc. Generic USB Joystick",2,7,12,0, 
         {0x79,0x6,"DragonRise Inc. Generic USB Joystick",2,7,12,0, 
@@ -839,8 +822,8 @@ namespace gameplay
                                                                           Gamepad::BUTTON_R1, 
                                                                           Gamepad::BUTTON_R1, 
                                                                           Gamepad::BUTTON_L2,    
                                                                           Gamepad::BUTTON_L2,    
                                                                           Gamepad::BUTTON_R2,   
                                                                           Gamepad::BUTTON_R2,   
-                                                                          Gamepad::BUTTON_MENU2,   
                                                                           Gamepad::BUTTON_MENU1,   
                                                                           Gamepad::BUTTON_MENU1,   
+                                                                          Gamepad::BUTTON_MENU2,   
                                                                           Gamepad::BUTTON_L3,
                                                                           Gamepad::BUTTON_L3,
                                                                           Gamepad::BUTTON_R3,
                                                                           Gamepad::BUTTON_R3,
                                                                          }
                                                                          }
@@ -856,10 +839,10 @@ namespace gameplay
                                                                      {-1,0,0,0,0,0,NEG_TO_POS}
                                                                      {-1,0,0,0,0,0,NEG_TO_POS}
                                                                  },
                                                                  },
                                              (long[]) {
                                              (long[]) {
-                                                                          Gamepad::BUTTON_MENU2,    
+                                                                          Gamepad::BUTTON_MENU1,    
                                                                           Gamepad::BUTTON_L3,  
                                                                           Gamepad::BUTTON_L3,  
                                                                           Gamepad::BUTTON_R3,  
                                                                           Gamepad::BUTTON_R3,  
-                                                                          Gamepad::BUTTON_MENU1, 
+                                                                          Gamepad::BUTTON_MENU2, 
                                                                           Gamepad::BUTTON_UP, 
                                                                           Gamepad::BUTTON_UP, 
                                                                           Gamepad::BUTTON_RIGHT, 
                                                                           Gamepad::BUTTON_RIGHT, 
                                                                           Gamepad::BUTTON_DOWN,    
                                                                           Gamepad::BUTTON_DOWN,    
@@ -879,6 +862,42 @@ namespace gameplay
         }
         }
     };
     };
 
 
+    bool isGamepadDevRegistered(dev_t devId)
+    {
+        for(list<ConnectedGamepadDevInfo>::iterator it = __connectedGamepads.begin(); it != __connectedGamepads.end();++it)
+        {
+            if(devId == (*it).deviceId) return true;
+        }
+        return false;
+    }
+
+    void closeGamepad(const ConnectedGamepadDevInfo& gamepadDevInfo)
+    {
+        ::close(gamepadDevInfo.fd);
+    }
+
+    void unregisterGamepad(GamepadHandle handle)
+    {
+        for(list<ConnectedGamepadDevInfo>::iterator it = __connectedGamepads.begin(); it != __connectedGamepads.end();++it)
+        {
+            if(handle == (*it).fd)
+            {
+                closeGamepad(*it);
+                __connectedGamepads.erase(it);
+                return;
+            }
+        }
+    }
+
+    void closeAllGamepads()
+    {
+        for(list<ConnectedGamepadDevInfo>::iterator it = __connectedGamepads.begin(); it != __connectedGamepads.end();++it)
+        {
+            closeGamepad(*it);
+            __connectedGamepads.erase(it);
+        }
+    }
+
     const GamepadInfoEntry& getGamepadMappedInfo(unsigned int vendorId, unsigned int productId, unsigned int numberOfAxes, unsigned int numberOfButtons)
     const GamepadInfoEntry& getGamepadMappedInfo(unsigned int vendorId, unsigned int productId, unsigned int numberOfAxes, unsigned int numberOfButtons)
     {
     {
         for(int i=0;i<sizeof(gamepadLookupTable)/sizeof(GamepadInfoEntry);i++)
         for(int i=0;i<sizeof(gamepadLookupTable)/sizeof(GamepadInfoEntry);i++)
@@ -966,10 +985,26 @@ namespace gameplay
         return ret;
         return ret;
     }
     }
 
 
+    bool isBlackListed(unsigned int vendorId, unsigned int productId)
+    {
+        switch(vendorId)
+        {
+            case 0x0e0f: //virtual machine devices
+                if(productId == 0x0003) // Virtual Mouse
+                    return true;
+        }
+        return false;
+    }
+
     void handleConnectedGamepad(dev_t devId, const char* devPath, const char* sysFSIdPath)
     void handleConnectedGamepad(dev_t devId, const char* devPath, const char* sysFSIdPath)
     {
     {
         GP_ASSERT(devPath);
         GP_ASSERT(devPath);
 
 
+        unsigned int vendorId =readIntegerGamepadIdPropery(sysFSIdPath,"vendor");
+        unsigned int productId =readIntegerGamepadIdPropery(sysFSIdPath,"product");
+
+        if(isBlackListed(vendorId,productId)) return;
+
         GamepadHandle handle = ::open(devPath,O_RDONLY | O_NONBLOCK);
         GamepadHandle handle = ::open(devPath,O_RDONLY | O_NONBLOCK);
         if(handle < 0)
         if(handle < 0)
         {
         {
@@ -985,9 +1020,6 @@ namespace gameplay
         ioctl (handle, JSIOCGAXES, &axesNum);
         ioctl (handle, JSIOCGAXES, &axesNum);
         ioctl (handle, JSIOCGBUTTONS, &btnsNum);
         ioctl (handle, JSIOCGBUTTONS, &btnsNum);
 
 
-        unsigned int vendorId =readIntegerGamepadIdPropery(sysFSIdPath,"vendor");
-        unsigned int productId =readIntegerGamepadIdPropery(sysFSIdPath,"product");
-
         const GamepadInfoEntry& gpInfo = getGamepadMappedInfo(vendorId,productId,(unsigned int)axesNum,(unsigned int)btnsNum);
         const GamepadInfoEntry& gpInfo = getGamepadMappedInfo(vendorId,productId,(unsigned int)axesNum,(unsigned int)btnsNum);
         unsigned int numJS = gpInfo.numberOfJS;
         unsigned int numJS = gpInfo.numberOfJS;
         unsigned int numTR = gpInfo.numberOfTriggers;
         unsigned int numTR = gpInfo.numberOfTriggers;
@@ -1044,8 +1076,6 @@ namespace gameplay
         }
         }
     }
     }
 
 
-#if !UDEV_USED
-
     void enumGamepads()
     void enumGamepads()
     {
     {
         const int maxDevs = 16;
         const int maxDevs = 16;
@@ -1069,7 +1099,6 @@ namespace gameplay
             }
             }
         }
         }
     }
     }
-#endif
 
 
     void gamepadHandlingLoop()
     void gamepadHandlingLoop()
     {
     {
@@ -1313,7 +1342,6 @@ namespace gameplay
 
 
     void Platform::signalShutdown()
     void Platform::signalShutdown()
     {
     {
-        // nothing to do  
     }
     }
 
 
     bool Platform::canExit()
     bool Platform::canExit()
@@ -1525,6 +1553,7 @@ namespace gameplay
 
 
     void Platform::shutdownInternal()
     void Platform::shutdownInternal()
     {
     {
+        closeAllGamepads();
         Game::getInstance()->shutdown();
         Game::getInstance()->shutdown();
     }
     }
 
 
@@ -1621,7 +1650,6 @@ namespace gameplay
         }
         }
         if(errno == ENODEV)
         if(errno == ENODEV)
         {
         {
-            ::close(gamepad->_handle);
             unregisterGamepad(gamepad->_handle);
             unregisterGamepad(gamepad->_handle);
             gamepadEventDisconnectedInternal(gamepad->_handle);
             gamepadEventDisconnectedInternal(gamepad->_handle);
         }
         }