void AttachKeyboardDeviceWithConfig(UnityInputDeviceProfile config)
        {
            if (_keyboardDevicesAttached)
            {
                return;
            }

            var keyboardDevice = new UnityInputDevice(config);

            AttachDevice(keyboardDevice);

            _keyboardDevicesAttached = true;
        }
        void DetectAttachedJoystickDevice(int unityJoystickId, string unityJoystickName)
        {
            if (unityJoystickName == "WIRED CONTROLLER" || unityJoystickName == " WIRED CONTROLLER")
            {
                // Ignore Steam controller for now.
                return;
            }

            if (unityJoystickName.IndexOf("webcam", StringComparison.OrdinalIgnoreCase) != -1)
            {
                // Unity thinks some webcams are joysticks. >_<
                return;
            }

            // As of Unity 4.6.3p1, empty strings on windows represent disconnected devices.
            if ((Application.platform == RuntimePlatform.WindowsEditor ||
                 Application.platform == RuntimePlatform.WindowsPlayer) && string.IsNullOrEmpty(unityJoystickName))
            {
                return;
            }

            UnityInputDeviceProfile matchedDeviceProfile =
                _deviceProfiles.Find(config => config.HasJoystickName(unityJoystickName))
                ?? _deviceProfiles.Find(config => config.HasLastResortRegex(unityJoystickName));

            UnityInputDeviceProfile deviceProfile = null;

            if (matchedDeviceProfile == null)
            {
                deviceProfile = new UnityUnknownDeviceProfile(unityJoystickName);
                _deviceProfiles.Add(deviceProfile);
            }
            else
            {
                deviceProfile = matchedDeviceProfile;
            }

            if (
                devices.OfType <UnityInputDevice>()
                .Any(unityDevice => unityDevice.IsConfiguredWith(deviceProfile, unityJoystickId)))
            {
                Log.Info("Device \"{0}\" is already configured with {1}", unityJoystickName, deviceProfile.Name);
                return;
            }

            if (!deviceProfile.IsHidden)
            {
                var joystickDevice = new UnityInputDevice(deviceProfile, unityJoystickId);
                AttachDevice(joystickDevice);

                if (matchedDeviceProfile == null)
                {
                    Log.Warning("Device {0} with name \"{1}\" does not match any known profiles.",
                                unityJoystickId,
                                unityJoystickName);
                }
                else
                {
                    Log.Info("Device {0} matched profile {1} ({2})",
                             unityJoystickId,
                             deviceProfile.GetType().Name,
                             deviceProfile.Name);
                }
            }
            else
            {
                Log.Info("Device {0} matching profile {1} ({2}) is hidden and will not be attached.",
                         unityJoystickId,
                         deviceProfile.GetType().Name,
                         deviceProfile.Name);
            }
        }