├── .editorconfig
├── .gitattributes
├── .github
├── dependabot.yml
└── workflows
│ └── support.yml
├── .gitignore
├── .vscode
└── settings.json
├── CommonProjectProperties.targets
├── DS4Windows
├── App.IPC.cs
├── App.Native.cs
├── App.xaml
├── App.xaml.cs
├── AsyncErrorHandler.cs
├── AutoProfileChecker.cs
├── AutoProfileHolder.cs
├── BezierCurveEditor
│ ├── build.js
│ └── index.html
├── CONTRIBUTORS.md
├── Changelog.json
├── Changelog.min.json
├── CommandLineOptions.cs
├── DS4Control
│ ├── BackingStore.cs
│ ├── ControlService.HidHide.cs
│ ├── ControlService.KBMHandler.cs
│ ├── ControlService.UDP.cs
│ ├── ControlService.ViGEm.cs
│ ├── ControlService.cs
│ ├── ControllerSlotManager.cs
│ ├── DS4LightBar.cs
│ ├── DS4LightBarV3.cs
│ ├── DS4OutDevices
│ │ ├── DS4OutDeviceBasic.cs
│ │ ├── DS4OutDeviceExt.cs
│ │ ├── DS4OutDeviceExtras.cs
│ │ └── DS4OutDeviceFactory.cs
│ ├── DS4StateFieldMapping.cs
│ ├── Global.BackingStore.cs
│ ├── Global.Methods.cs
│ ├── Global.StaticMethods.cs
│ ├── Global.StaticProperties.cs
│ ├── Global.cs
│ ├── HidHideAPIDevice.cs
│ ├── ITouchpadBehaviour.cs
│ ├── InputMethods.cs
│ ├── IoC
│ │ ├── HostedServices
│ │ │ ├── StartupChecksUserNotifications.cs
│ │ │ └── WebServerHost.cs
│ │ ├── README.md
│ │ └── Services
│ │ │ ├── ExternalDependenciesService.cs
│ │ │ └── LinkedProfilesService.cs
│ ├── Logging
│ │ ├── AppLogger.cs
│ │ └── StatusLogMsg.cs
│ ├── MacroParser.cs
│ ├── Mapping.cs
│ ├── Mouse.cs
│ ├── MouseCursor.cs
│ ├── MouseWheel.cs
│ ├── OutputKBM
│ │ ├── FakerInputHandler.cs
│ │ ├── FakerInputMapping.cs
│ │ ├── SendInputHandler.cs
│ │ ├── SendInputMapping.cs
│ │ ├── VirtualKBMBase.cs
│ │ ├── VirtualKBMFactory.cs
│ │ └── VirtualKBMMapping.cs
│ ├── OutputSlotManager.cs
│ ├── OutputSlotPersist.cs
│ ├── PresetOption.cs
│ ├── Profiles
│ │ └── Schema
│ │ │ ├── ApplicationSettingsSchema.Legacy..cs
│ │ │ ├── ApplicationSettingsSchema.Storage.cs
│ │ │ ├── AutoProfilesSchema.Legacy.cs
│ │ │ ├── ControllerConfigsSchema.cs
│ │ │ ├── Converters
│ │ │ ├── BezierCurveConverter.cs
│ │ │ ├── BooleanConverter.cs
│ │ │ ├── CustomLedConverter.cs
│ │ │ ├── DS4ColorConverter.cs
│ │ │ ├── DateTimeConverter.cs
│ │ │ ├── DoubleConverter.cs
│ │ │ ├── GuidConverter.cs
│ │ │ ├── IntegerListConverter.cs
│ │ │ ├── PhysicalAddressConverter.cs
│ │ │ ├── SensitivityConverter.cs
│ │ │ ├── SpecialActionsConverter.cs
│ │ │ └── VersionConverter.cs
│ │ │ ├── LinkedProfilesSchema.Legacy.cs
│ │ │ ├── Migrations
│ │ │ ├── AutoProfilesMigration.cs
│ │ │ ├── ControlsCollectionEntityMigration.cs
│ │ │ ├── LinkedControllersMigration.cs
│ │ │ └── OutputSlotsMigration.cs
│ │ │ ├── OutputSlotsSchema.cs
│ │ │ ├── ProfileSchema.ChildTypes.cs
│ │ │ ├── ProfileSchema.Legacy.cs
│ │ │ ├── ProfileSchema.Storage.cs
│ │ │ └── XmlSerializable.cs
│ ├── ScpUtil.cs
│ ├── SpecialAction.cs
│ ├── SpecialActionV3.cs
│ ├── UdpServer.cs
│ ├── Util.cs
│ ├── Util
│ │ └── DeviceNotificationListener.cs
│ └── Xbox360OutDevice.cs
├── DS4Forms
│ ├── About.xaml
│ ├── About.xaml.cs
│ ├── AutoProfiles.xaml
│ ├── AutoProfiles.xaml.cs
│ ├── AxialStickUserControl.xaml
│ ├── AxialStickUserControl.xaml.cs
│ ├── BindingWindow.xaml
│ ├── BindingWindow.xaml.cs
│ ├── ChangelogWindow.xaml
│ ├── ChangelogWindow.xaml.cs
│ ├── ColorPickerWindow.xaml
│ ├── ColorPickerWindow.xaml.cs
│ ├── ControllerReadingsControl.xaml
│ ├── ControllerReadingsControl.xaml.cs
│ ├── ControllerRegisterOptionsWindow.xaml
│ ├── ControllerRegisterOptionsWindow.xaml.cs
│ ├── Converters
│ │ └── EscapeAccessKeysConverter.cs
│ ├── DupBox.xaml
│ ├── DupBox.xaml.cs
│ ├── LanguagePackControl.xaml
│ ├── LanguagePackControl.xaml.cs
│ ├── LogMessageDisplay.xaml
│ ├── LogMessageDisplay.xaml.cs
│ ├── MainWindow.Updater.cs
│ ├── MainWindow.Utils.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── MainWindowWndProc.cs
│ ├── OutputSlotManagerControl.xaml
│ ├── OutputSlotManagerControl.xaml.cs
│ ├── PluginOutDevWindow.xaml
│ ├── PluginOutDevWindow.xaml.cs
│ ├── PresetOptionWindow.xaml
│ ├── PresetOptionWindow.xaml.cs
│ ├── ProfileEditor.Init.cs
│ ├── ProfileEditor.Mappings.cs
│ ├── ProfileEditor.xaml
│ ├── ProfileEditor.xaml.cs
│ ├── RecordBox.xaml
│ ├── RecordBox.xaml.cs
│ ├── RecordBoxWindow.xaml
│ ├── RecordBoxWindow.xaml.cs
│ ├── RenameProfileWindow.xaml
│ ├── RenameProfileWindow.xaml.cs
│ ├── SaveWhere.xaml
│ ├── SaveWhere.xaml.cs
│ ├── SpecialActionEditor.xaml
│ ├── SpecialActionEditor.xaml.cs
│ ├── Themes
│ │ ├── Common.xaml
│ │ ├── DarkTheme.xaml
│ │ └── DefaultTheme.xaml
│ ├── UpdaterWindow.xaml
│ ├── UpdaterWindow.xaml.cs
│ ├── UtilMethods.cs
│ ├── ViewModels
│ │ ├── AutoProfilesViewModel.cs
│ │ ├── AxialStickControlViewModel.cs
│ │ ├── BindingWindowViewModel.cs
│ │ ├── ChangelogViewModel.cs
│ │ ├── ControllerListViewModel.cs
│ │ ├── ControllerRegDeviceOptsViewModel.cs
│ │ ├── CurrentOutDeviceViewModel.cs
│ │ ├── LanguagePackViewModel.cs
│ │ ├── MainWindowsViewModel.cs
│ │ ├── MappingListViewModel.cs
│ │ ├── PresetOptionViewModel.cs
│ │ ├── ProfileSettingsViewModel.Properties.cs
│ │ ├── ProfileSettingsViewModel.SupportiveTypes.cs
│ │ ├── ProfileSettingsViewModel.cs
│ │ ├── RecordBoxViewModel.cs
│ │ ├── RenameProfileViewModel.cs
│ │ ├── SettingsViewModel.cs
│ │ ├── SpecialActEditorViewModel.cs
│ │ ├── SpecialActions
│ │ │ ├── CheckBatteryViewModel.cs
│ │ │ ├── DisconnectBTViewModel.cs
│ │ │ ├── LaunchProgramViewModel.cs
│ │ │ ├── LoadProfileViewModel.cs
│ │ │ ├── MacroViewModel.cs
│ │ │ ├── MultiActButtonViewModel.cs
│ │ │ ├── PressKeyViewModel.cs
│ │ │ └── SASteeringWheelViewModel.cs
│ │ ├── SpecialActionsListViewModel.cs
│ │ ├── TrayIconViewModel.cs
│ │ ├── UpdaterWindowViewModel.cs
│ │ └── Util
│ │ │ ├── EnumChoiceSelection.cs
│ │ │ └── NotifyDataErrorBase.cs
│ ├── WelcomeDialog.xaml
│ └── WelcomeDialog.xaml.cs
├── DS4Library
│ ├── Crc32.cs
│ ├── DS4Audio.cs
│ ├── DS4Device.cs
│ ├── DS4DeviceEnumerator.cs
│ ├── DS4Devices.Types.cs
│ ├── DS4StateExposed.cs
│ ├── DS4Touchpad.cs
│ ├── InputDevices
│ │ ├── DualSenseDevice.Native.cs
│ │ ├── DualSenseDevice.cs
│ │ ├── InputDeviceFactory.cs
│ │ ├── JoyConDevice.cs
│ │ └── SwitchProDevice.cs
│ └── LICENSE-Crc32.txt
├── DS4W.ico
├── DS4WinWPF.csproj
├── DS4Windows.ico
├── DateTimeJsonConverter.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── HidLibrary
│ ├── Extensions.cs
│ ├── HidDeviceAttributes.cs
│ ├── HidDeviceCapabilities.cs
│ ├── HidDeviceV3.cs
│ ├── HidDevices.cs
│ ├── LICENSE
│ └── NativeMethods.cs
├── ProfileEntity.cs
├── ProfileList.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.ja.resx
│ ├── Resources.resx
│ ├── Resources.ru.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── README.md
├── ReaderWriteLockSlimWrappers.cs
├── Resources
│ ├── 360 fades.png
│ ├── 360 highlight.png
│ ├── 360 map.png
│ ├── A.PNG
│ ├── B.png
│ ├── BACK.png
│ ├── BT.png
│ ├── BT_white.png
│ ├── DOWN.png
│ ├── DS4 Config.png
│ ├── DS4 Config_white.png
│ ├── DS4 Controller.png
│ ├── DS4 lightbar.png
│ ├── DS4-Config_Circle.png
│ ├── DS4-Config_Cross.png
│ ├── DS4-Config_Down.png
│ ├── DS4-Config_L1.png
│ ├── DS4-Config_L2.png
│ ├── DS4-Config_LS.png
│ ├── DS4-Config_Left.png
│ ├── DS4-Config_PS.png
│ ├── DS4-Config_R1.png
│ ├── DS4-Config_R2.png
│ ├── DS4-Config_RS.png
│ ├── DS4-Config_Right.png
│ ├── DS4-Config_Share.png
│ ├── DS4-Config_Square.png
│ ├── DS4-Config_TouchLeft.png
│ ├── DS4-Config_TouchMulti.png
│ ├── DS4-Config_TouchRight.png
│ ├── DS4-Config_TouchUpper.png
│ ├── DS4-Config_Triangle.png
│ ├── DS4-Config_Up.png
│ ├── DS4-Config_options.png
│ ├── DS4.ico
│ ├── DS4W - Black.ico
│ ├── DS4W - White.ico
│ ├── DS4W.ico
│ ├── LB.png
│ ├── LEFT.png
│ ├── LS.png
│ ├── LSD.png
│ ├── LSL.png
│ ├── LSR.png
│ ├── LSU.png
│ ├── LT.png
│ ├── Pairmode.png
│ ├── RB.png
│ ├── RIGHT.png
│ ├── RS.png
│ ├── RSD.png
│ ├── RSL.png
│ ├── RSR.png
│ ├── RSU.png
│ ├── RT.png
│ ├── Red Circle.png
│ ├── START.png
│ ├── UP.png
│ ├── USB.png
│ ├── USB_white.png
│ ├── UpperTouch.png
│ ├── X.png
│ ├── Y.png
│ ├── cancel.png
│ ├── cancel_white.png
│ ├── checked.png
│ ├── checked_white.png
│ ├── clock.png
│ ├── clock_white.png
│ ├── copy.png
│ ├── copy_white.png
│ ├── delete.png
│ ├── delete_white.png
│ ├── edit.png
│ ├── edit_white.png
│ ├── export.png
│ ├── export_white.png
│ ├── import.png
│ ├── import_white.png
│ ├── key-solid.png
│ ├── key-solid_white.png
│ ├── keydown.png
│ ├── keydown_white.png
│ ├── keyup.png
│ ├── keyup_white.png
│ ├── left touch.png
│ ├── mouse.png
│ ├── newprofile.png
│ ├── newprofile_white.png
│ ├── none.png
│ ├── rainbow.png
│ ├── rainbowC.png
│ ├── rainbowCCrop.png
│ ├── right touch.png
│ ├── saveprofile.png
│ ├── size.png
│ ├── social
│ │ ├── GitHub-Mark-64px.png
│ │ ├── GitHub-Mark-Light-64px.png
│ │ ├── bittube.png
│ │ ├── mastodon.png
│ │ ├── minds.png
│ │ ├── twitter_logo_initial.png
│ │ └── youtube_social_icon_red.png
│ ├── x360test.png
│ └── xbox_360_controller.png
├── Splashscreen.png
├── StartupMethods.cs
├── Translations
│ ├── Strings.Designer.cs
│ ├── Strings.ar.resx
│ ├── Strings.cs.resx
│ ├── Strings.de.resx
│ ├── Strings.es.resx
│ ├── Strings.fr.resx
│ ├── Strings.he.resx
│ ├── Strings.hu-HU.resx
│ ├── Strings.it.resx
│ ├── Strings.ja.resx
│ ├── Strings.nl.resx
│ ├── Strings.pl.resx
│ ├── Strings.pt-BR.resx
│ ├── Strings.pt.resx
│ ├── Strings.resx
│ ├── Strings.ru.resx
│ ├── Strings.uk-UA.resx
│ ├── Strings.zh-CN.resx
│ └── Strings.zh-TW.resx
├── VJoyFeeder
│ └── vJoyFeeder.cs
├── app.manifest
├── appsettings.json
├── libs
│ ├── x64
│ │ ├── FakerInputWrapper
│ │ │ ├── FakerInputDll.dll
│ │ │ └── FakerInputWrapper.dll
│ │ └── Nefarius.ViGEm.Client
│ │ │ └── Nefarius.ViGEm.Client.dll
│ └── x86
│ │ ├── FakerInputWrapper
│ │ ├── FakerInputDll.dll
│ │ └── FakerInputWrapper.dll
│ │ └── Nefarius.ViGEm.Client
│ │ └── Nefarius.ViGEm.Client.dll
└── newest.txt
├── Installer
├── AppVeyor_ProductKey.txt.enc
├── Build.ps1
├── Images
│ └── Vapour.ico
├── PostBuild.ps1
└── Vapour.Installer.x64.aip
├── LICENSE
├── NOTICE.txt
├── README.md
├── Vapour.Client.Core.Interfaces
├── Constants.cs
├── DependencyInjection
│ └── IServiceRegistrar.cs
├── Vapour.Client.Core.Interfaces.csproj
├── View
│ └── IView.cs
└── ViewModel
│ ├── INavigationTabViewModel.cs
│ ├── IViewModel.cs
│ └── IViewModelFactory.cs
├── Vapour.Client.Core
├── ApplicationStartup.cs
├── DependencyInjection
│ ├── HostingExtensions.cs
│ └── RegistrarDiscovery.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Vapour.Client.Core.csproj
└── ViewModel
│ ├── NavigationTabViewModel.cs
│ ├── ViewModel.cs
│ ├── ViewModelFactory.cs
│ └── ViewModelRegistrar.cs
├── Vapour.Client.Modules.Interfaces
├── InputSource
│ ├── IAddGameListView.cs
│ ├── IAddGameListViewModel.cs
│ ├── IGameConfigurationItemViewModel.cs
│ ├── IInputSourceConfigureView.cs
│ ├── IInputSourceConfigureViewModel.cs
│ ├── IInputSourceControllerItemViewModel.cs
│ ├── IInputSourceItemViewModel.cs
│ ├── IInputSourceListView.cs
│ └── IInputSourceListViewModel.cs
├── Main
│ ├── Constants.cs
│ ├── IMainView.cs
│ └── IMainViewModel.cs
├── Profiles
│ ├── Edit
│ │ ├── IProfileEditView.cs
│ │ ├── IProfileEditViewModel.cs
│ │ ├── ISixAxisEditView.cs
│ │ ├── ISixAxisEditViewModel.cs
│ │ ├── IStickControlModeSettingsView.cs
│ │ ├── IStickControlModeSettingsViewModel.cs
│ │ ├── IStickEditView.cs
│ │ ├── IStickEditViewModel.cs
│ │ ├── ITriggerButtonsEditView.cs
│ │ └── ITriggerButtonsEditViewModel.cs
│ ├── IProfileListItemViewModel.cs
│ ├── IProfilesView.cs
│ ├── IProfilesViewModel.cs
│ └── ISelectableProfileItemViewModel.cs
├── Settings
│ ├── ISettingsView.cs
│ └── ISettingsViewModel.cs
└── Vapour.Client.Modules.Interfaces.csproj
├── Vapour.Client.Modules
├── BezierCurveEditor
│ ├── build.js
│ └── index.html
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── InputSource
│ ├── AddGameListView.xaml
│ ├── AddGameListView.xaml.cs
│ ├── AddGameListViewModel.cs
│ ├── ControllerDisplayView.xaml
│ ├── ControllerDisplayView.xaml.cs
│ ├── Converters
│ │ └── ComparisonConverter.cs
│ ├── GameConfigurationItemViewModel.cs
│ ├── Images
│ │ ├── BT.png
│ │ ├── BT_white.png
│ │ ├── DualSense.jpg
│ │ ├── DualShock 4 v1.jpg
│ │ ├── DualShock 4 v2.jpg
│ │ ├── JoyCon (L).jpg
│ │ ├── JoyCon (R).jpg
│ │ ├── Steam Deck.jpg
│ │ ├── Switch Pro.jpg
│ │ ├── USB.png
│ │ ├── USB_white.png
│ │ └── Xbox One S.png
│ ├── InputSourceConfigureView.xaml
│ ├── InputSourceConfigureView.xaml.cs
│ ├── InputSourceConfigureViewModel.cs
│ ├── InputSourceControllerItemViewModel.cs
│ ├── InputSourceItemViewModel.Properties.cs
│ ├── InputSourceItemViewModel.cs
│ ├── InputSourceListView.xaml
│ ├── InputSourceListView.xaml.cs
│ ├── InputSourceListViewModel.cs
│ └── Utils
│ │ ├── InputSourceAutoMapper.cs
│ │ └── InputSourceModuleRegistrar.cs
├── Main
│ ├── Images
│ │ ├── DS4W.ico
│ │ └── Vapour.ico
│ ├── MainModuleRegistrar.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ └── MainWindowViewModel.cs
├── Profiles
│ ├── Converters
│ │ └── BezierCurveConverter.cs
│ ├── Edit
│ │ ├── ProfileEditView.xaml
│ │ ├── ProfileEditView.xaml.cs
│ │ ├── ProfileEditViewModel.cs
│ │ ├── SixAxisEditView.xaml
│ │ ├── SixAxisEditView.xaml.cs
│ │ ├── SixAxisEditViewModel.cs
│ │ ├── StickControlModeSettingsView.xaml
│ │ ├── StickControlModeSettingsView.xaml.cs
│ │ ├── StickControlModeSettingsViewModel.cs
│ │ ├── StickEditView.xaml
│ │ ├── StickEditView.xaml.cs
│ │ ├── StickEditViewModel.cs
│ │ ├── TriggerButtonsEditView.xaml
│ │ ├── TriggerButtonsEditView.xaml.cs
│ │ └── TriggerButtonsEditViewModel.cs
│ ├── ProfileListItemViewModel.cs
│ ├── ProfilesView.xaml
│ ├── ProfilesView.xaml.cs
│ ├── ProfilesViewModel.cs
│ ├── SelectableProfileItemViewModel.cs
│ └── Utils
│ │ ├── ProfilesAutoMapper.cs
│ │ └── ProfilesModuleRegistrar.cs
├── Settings
│ ├── InstallFilterDriverWarning.xaml
│ ├── InstallFilterDriverWarning.xaml.cs
│ ├── SettingsModuleRegistrar.cs
│ ├── SettingsView.xaml
│ ├── SettingsView.xaml.cs
│ └── SettingsViewModel.cs
└── Vapour.Client.Modules.csproj
├── Vapour.Client.Package
├── Images
│ ├── LargeTile.scale-100.png
│ ├── LargeTile.scale-125.png
│ ├── LargeTile.scale-150.png
│ ├── LargeTile.scale-200.png
│ ├── LargeTile.scale-400.png
│ ├── LockScreenLogo.scale-200.png
│ ├── SmallTile.scale-100.png
│ ├── SmallTile.scale-125.png
│ ├── SmallTile.scale-150.png
│ ├── SmallTile.scale-200.png
│ ├── SmallTile.scale-400.png
│ ├── SplashScreen.scale-100.png
│ ├── SplashScreen.scale-125.png
│ ├── SplashScreen.scale-150.png
│ ├── SplashScreen.scale-200.png
│ ├── SplashScreen.scale-400.png
│ ├── Splashscreen.png
│ ├── Square150x150Logo.scale-100.png
│ ├── Square150x150Logo.scale-125.png
│ ├── Square150x150Logo.scale-150.png
│ ├── Square150x150Logo.scale-200.png
│ ├── Square150x150Logo.scale-400.png
│ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png
│ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png
│ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png
│ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png
│ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png
│ ├── Square44x44Logo.altform-unplated_targetsize-16.png
│ ├── Square44x44Logo.altform-unplated_targetsize-256.png
│ ├── Square44x44Logo.altform-unplated_targetsize-32.png
│ ├── Square44x44Logo.altform-unplated_targetsize-48.png
│ ├── Square44x44Logo.scale-100.png
│ ├── Square44x44Logo.scale-125.png
│ ├── Square44x44Logo.scale-150.png
│ ├── Square44x44Logo.scale-200.png
│ ├── Square44x44Logo.scale-400.png
│ ├── Square44x44Logo.targetsize-16.png
│ ├── Square44x44Logo.targetsize-24.png
│ ├── Square44x44Logo.targetsize-24_altform-unplated.png
│ ├── Square44x44Logo.targetsize-256.png
│ ├── Square44x44Logo.targetsize-32.png
│ ├── Square44x44Logo.targetsize-48.png
│ ├── StoreLogo.backup.png
│ ├── StoreLogo.scale-100.png
│ ├── StoreLogo.scale-125.png
│ ├── StoreLogo.scale-150.png
│ ├── StoreLogo.scale-200.png
│ ├── StoreLogo.scale-400.png
│ ├── Wide310x150Logo.scale-100.png
│ ├── Wide310x150Logo.scale-125.png
│ ├── Wide310x150Logo.scale-150.png
│ ├── Wide310x150Logo.scale-200.png
│ └── Wide310x150Logo.scale-400.png
├── Package.appxmanifest
└── Vapour.Client.Package.wapproj
├── Vapour.Client.ServiceClients.Interfaces
├── IInputSourceServiceClient.cs
├── IProfileServiceClient.cs
├── ISystemServiceClient.cs
├── ProfileItem.cs
└── Vapour.Client.ServiceClients.Interfaces.csproj
├── Vapour.Client.ServiceClients
├── InputSourceServiceClient.Web.cs
├── InputSourceServiceClient.cs
├── ProfileServiceClient.Web.cs
├── ProfileServiceClient.cs
├── ServiceClientsRegistrar.cs
├── SystemServiceClient.Web.cs
├── SystemServiceClient.cs
└── Vapour.Client.ServiceClients.csproj
├── Vapour.Client.TrayApplication
├── App.xaml
├── App.xaml.cs
├── Converters
│ └── Converters
│ │ └── ComparisonConverter.cs
├── InputSourceListView.xaml
├── InputSourceListView.xaml.cs
├── TrayApplicationRegistrar.cs
├── TrayPopup.xaml
├── TrayPopup.xaml.cs
├── TrayViewModel.cs
├── Vapour.Client.TrayApplication.appsettings.json
├── Vapour.Client.TrayApplication.csproj
└── Vapour.ico
├── Vapour.Client
├── App.xaml
├── App.xaml.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Vapour.Client.csproj
├── Vapour.appsettings.json
├── Vapour.ico
└── app.manifest
├── Vapour.Server.Host
├── .config
│ └── dotnet-tools.json
├── InputSource
│ ├── Endpoints
│ │ ├── Configuration
│ │ │ ├── DeleteGameInputSourceConfigurationEndpoint.cs
│ │ │ ├── GetGameListEndpoint.cs
│ │ │ ├── InputSourceGameConfigurationsEndpoint.cs
│ │ │ ├── InputSourceSaveDefaultConfigurationEndpoint.cs
│ │ │ └── SaveInputSourceGameConfigurationEndpoint.cs
│ │ └── InputSourceListEndpoint.cs
│ ├── InputSourceMessageForwarder.cs
│ └── InputSourceMessageHub.cs
├── NativeMethods.txt
├── Profile
│ ├── Endpoints
│ │ ├── ProfileDeleteEndpoint.cs
│ │ ├── ProfileListEndpoint.cs
│ │ ├── ProfileNewEndpoint.cs
│ │ └── ProfileSaveEndpoint.cs
│ ├── ProfileMessageForwarder.cs
│ └── ProfileMessageHub.cs
├── Program.cs
├── ServerHostRegistrar.cs
├── ServiceStartup.cs
├── System
│ ├── Endpoints
│ │ ├── SystemFilterDriverActionsEndpoint.cs
│ │ ├── SystemFilterDriverStatusEndpoint.cs
│ │ ├── SystemHostStatusEndpoint.cs
│ │ ├── SystemPingEndpoint.cs
│ │ ├── SystemStartHostEndpoint.cs
│ │ └── SystemStopHostEndpoint.cs
│ ├── SystemMessageForwarder.cs
│ ├── SystemMessageHub.cs
│ └── SystemService.cs
├── Usings.cs
├── Vapour.Server.Host.appsettings.json
├── Vapour.Server.Host.csproj
├── VapourServiceLifetime.cs
└── runsdvui.cmd
├── Vapour.Server.Interfaces
├── InputSource
│ ├── Configuration
│ │ ├── GameListRequest.cs
│ │ ├── InputSourceConfigurationChangedMessage.cs
│ │ ├── InputSourceSetConfigRequest.cs
│ │ └── SaveInputSourceGameConfigurationRequest.cs
│ ├── IInputSourceMessageClient.cs
│ ├── IInputSourceMessageForwarder.cs
│ ├── InputSourceController.cs
│ ├── InputSourceMessage.cs
│ ├── InputSourceRemovedMessage.cs
│ └── ProfileChangedMessage.cs
├── Profile
│ ├── IProfileMessageClient.cs
│ ├── IProfileMessageForwarder.cs
│ └── ProfileDeleteRequest.cs
├── System
│ ├── ISystemMessageClient.cs
│ ├── ISystemMessageForwarder.cs
│ ├── IsHostRunningChangedMessage.cs
│ ├── SystemFilterDriverStatusResponse.cs
│ └── SystemHostStatusResponse.cs
└── Vapour.Server.Interfaces.csproj
├── Vapour.Shared.Common.Interfaces
├── Attributes
│ ├── ConfigurationSystemComponentAttribute.cs
│ ├── HighMemoryPressureAttribute.cs
│ ├── IntermediateSolutionAttribute.cs
│ ├── LoggingComponentAttribute.cs
│ └── MissingLocalizationAttribute.cs
├── Converters
│ └── EnumDescriptionConverter.cs
├── Core
│ └── Constants.cs
├── DeviceValueConverters.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── IDeviceValueConverters.cs
├── Legacy
│ ├── ControlActionData.cs
│ ├── ControlSettingsGroup.cs
│ ├── DS4ControlSettingsV3.cs
│ ├── DS4State.cs
│ └── TypeDefinitions.cs
├── Services
│ └── IGlobalStateService.cs
├── Telemetry
│ └── TracingSources.cs
├── Types
│ ├── AppThemeChoice.cs
│ ├── BezierCurve.cs
│ ├── BluetoothOutputReportMethod.cs
│ ├── ButtonMouseInfo.cs
│ ├── CurveMode.cs
│ ├── DS4Color.cs
│ ├── DS4ControlItem.cs
│ ├── DS4ForceFeedbackState.cs
│ ├── DS4HapticState.cs
│ ├── DS4LightbarState.cs
│ ├── DualSense
│ │ └── HapticIntensity.cs
│ ├── FlickStickSettings.cs
│ ├── GyroControlsInfo.cs
│ ├── GyroDirectionalSwipeInfo.cs
│ ├── GyroMouseInfo.cs
│ ├── GyroMouseSens.cs
│ ├── GyroMouseStickInfo.cs
│ ├── GyroOutMode.cs
│ ├── LightbarDS4WinInfo.cs
│ ├── LightbarMode.cs
│ ├── LightbarSettingInfo.cs
│ ├── OneEuroFilter.cs
│ ├── OneEuroFilter3D.cs
│ ├── OneEuroFilterPair.cs
│ ├── OutputDeviceType.cs
│ ├── SASteeringWheelEmulationAxisType.cs
│ ├── SIXAXIS.cs
│ ├── SpecialAction.cs
│ ├── SquareStickInfo.cs
│ ├── SteeringWheelSmoothingInfo.cs
│ ├── StickAntiSnapbackInfo.cs
│ ├── StickControlSettings.cs
│ ├── StickDeadZoneInfo.cs
│ ├── StickModeSettings.cs
│ ├── StickOutputSetting.cs
│ ├── TouchPadRelMouseSettings.cs
│ ├── TouchpadAbsMouseSettings.cs
│ ├── TouchpadOutMode.cs
│ ├── TrayIconChoice.cs
│ ├── TriggerDeadZoneZInfo.cs
│ ├── TriggerEffects.cs
│ ├── TriggerOutputSettings.cs
│ └── X360ControlItem.cs
└── Vapour.Shared.Common.Interfaces.csproj
├── Vapour.Shared.Common.Utils
├── BitHelpers.cs
├── CRC32Utils.cs
├── CloningExtensions.cs
├── ColorExtensions.cs
├── MathsUtils.cs
├── StructHelpers.cs
└── Vapour.Shared.Common.Util.csproj
├── Vapour.Shared.Common
├── CommonRegistrar.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── README.md
├── Services
│ └── GlobalStateService.cs
├── Tracing
│ └── OpenTelemetryRegistrar.cs
├── Util
│ ├── ByteArrayUtils.cs
│ └── PhysicalAddressExtensions.cs
└── Vapour.Shared.Common.csproj
├── Vapour.Shared.Configuration.Profiles.Interfaces
├── Constants.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Schema
│ ├── IProfile.cs
│ └── ProfileChangedEventArgs.cs
├── Services
│ └── IProfilesService.cs
├── Types
│ └── ProfilePropertyChangedEventArgs.cs
└── Vapour.Shared.Configuration.Profiles.Interfaces.csproj
├── Vapour.Shared.Configuration.Profiles
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── ProfilesRegistrar.cs
├── README.md
├── Schema
│ └── ProfileSchema.cs
├── Services
│ └── ProfilesService.cs
└── Vapour.Shared.Configuration.Profiles.csproj
├── Vapour.Shared.Devices.Interfaces
├── DeviceSettings.cs
├── HID
│ ├── CompatibleDeviceIdentification.cs
│ ├── ConnectionType.cs
│ ├── DeviceInfos
│ │ ├── DeviceInfo.cs
│ │ ├── DualSenseDeviceInfo.cs
│ │ ├── DualShock4StrikePackDeviceInfo.cs
│ │ ├── DualShock4UsbWirelessAdapterDeviceInfo.cs
│ │ ├── DualShock4V1DeviceInfo.cs
│ │ ├── DualShock4V2DeviceInfo.cs
│ │ ├── JoyConLeftDeviceInfo.cs
│ │ ├── JoyConRightDeviceInfo.cs
│ │ ├── Meta
│ │ │ ├── DualShock4DeviceInfo.cs
│ │ │ ├── JoyConDeviceInfo.cs
│ │ │ └── XboxCompositeDeviceInfo.cs
│ │ ├── README.md
│ │ ├── SteamDeckDeviceInfo.cs
│ │ ├── SwitchProDeviceInfo.cs
│ │ ├── XboxEliteSeries1DeviceInfo.cs
│ │ ├── XboxEliteSeries2DeviceInfo.cs
│ │ ├── XboxOneSDeviceInfo.cs
│ │ ├── XboxWireless2DeviceInfo.cs
│ │ └── XboxWirelessDeviceInfo.cs
│ ├── DeviceNotificationListenerSubscriber.cs
│ ├── ICompatibleHidDevice.cs
│ ├── IDeviceFactory.cs
│ ├── IHidDevice.cs
│ ├── IInputSourceReport.cs
│ ├── IRawInputSourceReport.cs
│ ├── IStructInputSourceReport.cs
│ ├── InputDeviceService.cs
│ ├── InputTypes
│ │ ├── JoyCon
│ │ │ ├── In
│ │ │ │ ├── Enums.cs
│ │ │ │ ├── InConstants.cs
│ │ │ │ └── Structs.cs
│ │ │ └── Out
│ │ │ │ ├── OutConstants.cs
│ │ │ │ └── Structs.cs
│ │ ├── SteamDeck
│ │ │ ├── Feature
│ │ │ │ └── FeatureConstants.cs
│ │ │ └── In
│ │ │ │ ├── Enums.cs
│ │ │ │ ├── InConstants.cs
│ │ │ │ └── Structs.cs
│ │ └── Xbox
│ │ │ ├── CommonConstants.cs
│ │ │ ├── Feature
│ │ │ └── FeatureConstants.cs
│ │ │ ├── In
│ │ │ ├── Enums.cs
│ │ │ ├── InConstants.cs
│ │ │ └── Structs.cs
│ │ │ └── Out
│ │ │ └── OutConstants.cs
│ └── KnownDevices.cs
├── NativeMethods.json
├── NativeMethods.txt
├── Services
│ ├── Configuration
│ │ ├── GameInfo.cs
│ │ ├── IDeviceSettingsService.cs
│ │ ├── IFilterService.cs
│ │ ├── IGameListProviderService.cs
│ │ ├── IGameProcessWatcherService.cs
│ │ ├── IInputSourceConfigurationService.cs
│ │ ├── InputSourceConfiguration.cs
│ │ ├── InputSourceConfigurationChangedEventArgs.cs
│ │ ├── InputSourceConfigurationController.cs
│ │ ├── Messages
│ │ │ ├── GameWatchMessage.cs
│ │ │ └── MessageKeys.cs
│ │ └── ProcessorWatchItem.cs
│ ├── ControllerEnumerators
│ │ ├── HidDeviceOverWinUsbEndpoints.cs
│ │ └── IHidDeviceEnumeratorService.cs
│ ├── IInputSource.cs
│ ├── IInputSourceBuilderService.cs
│ ├── IInputSourceDataSource.cs
│ ├── IInputSourceProcessor.cs
│ ├── IInputSourceService.cs
│ ├── InputSourceFinalReport.cs
│ └── Reporting
│ │ ├── CustomActionReport.cs
│ │ ├── CustomActions
│ │ ├── GracefulShutdownAction.cs
│ │ ├── ICustomAction.cs
│ │ └── SetPlayerLedAndColorAction.cs
│ │ ├── ICustomActionProcessor.cs
│ │ ├── IInputReportProcessor.cs
│ │ ├── IOutDevice.cs
│ │ ├── IOutputDeviceProcessor.cs
│ │ ├── IOutputReportProcessor.cs
│ │ └── OutputDeviceReport.cs
└── Vapour.Shared.Devices.Interfaces.csproj
├── Vapour.Shared.Devices
├── DevicesRegistrar.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── HID
│ ├── CompatibleHidDevice.Factory.cs
│ ├── CompatibleHidDevice.cs
│ ├── Devices
│ │ ├── DualSenseCompatibleHidDevice.cs
│ │ ├── DualShock4CompatibleHidDevice.cs
│ │ ├── JoyConCompatibleHidDevice.cs
│ │ ├── Reports
│ │ │ ├── DualSenseCompatibleInputReport.cs
│ │ │ ├── DualShock4CompatibleInputReport.cs
│ │ │ ├── JoyConCompatibleInputReport.cs
│ │ │ ├── SteamDeckCompatibleInputReport.cs
│ │ │ └── XboxCompatibleInputReport.cs
│ │ ├── SteamDeckCompatibleHidDevice.cs
│ │ ├── SwitchProCompatibleHidDevice.cs
│ │ └── XboxCompositeCompatibleHidDevice.cs
│ ├── HidDevice.cs
│ ├── HidDeviceOverBluetooth.cs
│ ├── HidDeviceOverWinUsb.cs
│ └── InputSourceReport.cs
├── HostedServices
│ └── SystemManagerHost.cs
├── NativeMethods.txt
├── README.md
├── Services
│ ├── Configuration
│ │ ├── AcfReader.cs
│ │ ├── DeviceSettingsService.cs
│ │ ├── FilterService.Bluetooth.cs
│ │ ├── FilterService.Usb.cs
│ │ ├── FilterService.cs
│ │ ├── GameListProviderService.cs
│ │ ├── GameProcessWatcherService.cs
│ │ └── InputSourceConfigurationService.cs
│ ├── ControllerEnumerators
│ │ ├── HidDeviceEnumeratorService.cs
│ │ └── WinUsbDeviceEnumeratorService.cs
│ ├── InputSource.cs
│ ├── InputSourceBuilderService.cs
│ ├── InputSourceDataSource.cs
│ ├── InputSourceProcessor.cs
│ ├── InputSourceService.cs
│ └── Reporting
│ │ ├── CustomActionProcessor.cs
│ │ ├── Ds4OutDevice.cs
│ │ ├── InputReportProcessor.cs
│ │ ├── OutDevice.cs
│ │ ├── OutputDeviceProcessor.cs
│ │ ├── OutputReportProcessor.cs
│ │ └── Xbox360OutDevice.cs
├── Util
│ ├── IoControlCodes.cs
│ ├── StringHelperUtil.cs
│ └── VolumeHelper.cs
└── Vapour.Shared.Devices.csproj
├── Vapour.Shared.Emulator.ViGEmGen1
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Types
│ └── Legacy
│ │ ├── DS4OutDevice.cs
│ │ ├── OutSlotDevice.cs
│ │ └── OutputDevice.cs
└── Vapour.Shared.Emulator.ViGEmGen1.csproj
├── Vapour.sln
├── Vapour.sln.DotSettings
├── appveyor.yml
├── assets
├── AiLogoColorRightText.png
├── DS4Windows-128x128.png
├── Vapour-128x128.png
├── counters.png
└── setup_Z38OdfI0YX.png
├── doc
├── DS5-NOTES.md
└── dev
│ └── profile_version_info.md
├── nuget.config
└── snippets.snippet
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 |
3 | updates:
4 | - package-ecosystem: "nuget"
5 | directory: "/"
6 | schedule:
7 | interval: "weekly"
8 |
--------------------------------------------------------------------------------
/.github/workflows/support.yml:
--------------------------------------------------------------------------------
1 | name: 'Support Requests'
2 |
3 | on:
4 | issues:
5 | types: [labeled, unlabeled, reopened]
6 |
7 | permissions:
8 | issues: write
9 |
10 | jobs:
11 | action:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: dessant/support-requests@v2
15 | with:
16 | github-token: ${{ github.token }}
17 | support-label: 'support'
18 | issue-comment: >
19 | :wave: @{issue-author}, we use the issue tracker exclusively
20 | for bug reports and feature requests. However, this issue appears
21 | to be a support request. Please use our support channels
22 | to get help with the project.
23 | close-issue: true
24 | lock-issue: true
25 | issue-lock-reason: 'off-topic'
26 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cSpell.words": [
3 | "BSOD",
4 | "Fody",
5 | "Hardcodet",
6 | "Identinator",
7 | "reimagination",
8 | "Ryochan",
9 | "Serilog",
10 | "Spector",
11 | "Swashbuckle",
12 | "Xusb"
13 | ]
14 | }
--------------------------------------------------------------------------------
/CommonProjectProperties.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0-windows10.0.17763.0
5 | 10.0.22621.41
6 | x64;x86
7 | win-x86;win-x64
8 | disable
9 | enable
10 | true
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/DS4Windows/AsyncErrorHandler.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using JetBrains.Annotations;
3 | using Serilog;
4 |
5 | namespace DS4WinWPF
6 | {
7 | ///
8 | /// Catches unhandled async exceptions.
9 | ///
10 | /// https://github.com/Fody/AsyncErrorHandler
11 | public static class AsyncErrorHandler
12 | {
13 | [UsedImplicitly]
14 | public static void HandleException(Exception exception)
15 | {
16 | Log.Logger.Error(exception, "Unhandled async exception occurred");
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/DS4Windows/BezierCurveEditor/build.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/BezierCurveEditor/build.js
--------------------------------------------------------------------------------
/DS4Windows/BezierCurveEditor/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Bezier Curve Editor for DS4Windows
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/DS4Windows/CONTRIBUTORS.md:
--------------------------------------------------------------------------------
1 | # Contributor list
2 |
3 | Contributors to this project (appearance in no particular order):
4 |
5 | - Travis Nickles (Ryochan7)
6 | - AnessZurba
7 | - avsha114
8 | - bernspedras
9 | - carloshbcabral
10 | - DandelionSprout
11 | - dante38
12 | - dondrakon
13 | - Flo082002
14 | - firodj
15 | - Geroyuni
16 | - Haamar
17 | - hpesoj
18 | - jdanders
19 | - jdfeng
20 | - jmg2k
21 | - joaopedrogomes
22 | - justalemon
23 | - Kamilczak020
24 | - Кладовая
25 | - Korney Czukowski (czukowski)
26 | - Leonardo Melati (Leomelati)
27 | - MakiseKurisu
28 | - mayawei
29 | - mika-n
30 | - MikeCZ23
31 | - Benjamin Höglinger-Stelzer (nefarius)
32 | - nelitow
33 | - olokos
34 | - peter9811
35 | - Rajko Stojadinovic (rajkosto)
36 | - RedDevilus
37 | - RokasKil
38 | - sabihoshi
39 | - Sander0542
40 | - shikulja
41 | - sitiom
42 | - SyaoranChang
43 | - sergejkiller
44 | - SteelShot
45 | - stryblt
46 | - toshixm
47 | - tpneill
48 | - wingfixer
49 | - xLive
50 | - xrossb
51 | - Yuki-nyan
52 | - Torinth
53 | - Kanuan
54 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/ControlService.ViGEm.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using DS4WinWPF.Translations;
4 |
5 | namespace DS4Windows
6 | {
7 | public partial class ControlService
8 | {
9 | [Obsolete]
10 | private void OutputslotMan_ViGEmFailure(object sender, EventArgs e)
11 | {
12 | EventDispatcher.BeginInvoke((Action)(() =>
13 | {
14 | loopControllers = false;
15 | while (inServiceTask)
16 | Thread.SpinWait(1000);
17 |
18 | LogDebug(Strings.ViGEmPluginFailure, true);
19 | Stop();
20 | }));
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/DS4OutDevices/DS4OutDeviceFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using DS4Windows.Shared.Emulator.ViGEmGen1.Types.Legacy;
3 | using Nefarius.ViGEm.Client;
4 |
5 | namespace DS4Windows
6 | {
7 | internal static class DS4OutDeviceFactory
8 | {
9 | private static readonly Version ExtApiMinVersion = new("1.17.333.0");
10 |
11 | public static DS4OutDevice CreateDS4Device(ViGEmClient client,
12 | Version driverVersion)
13 | {
14 | DS4OutDevice result = null;
15 | if (ExtApiMinVersion.CompareTo(driverVersion) <= 0)
16 | result = new DS4OutDeviceExt(client);
17 | else
18 | result = new DS4OutDeviceBasic(client);
19 |
20 | return result;
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/ITouchpadBehaviour.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using DS4Windows.Shared.Common.Types;
3 |
4 | namespace DS4Windows
5 | {
6 | interface ITouchpadBehaviour
7 | {
8 | void TouchesBegan(DS4Touchpad sender, TouchpadEventArgs arg);
9 | void TouchesMoved(DS4Touchpad sender, TouchpadEventArgs arg);
10 | void touchButtonUp(DS4Touchpad sender, TouchpadEventArgs arg);
11 | void touchButtonDown(DS4Touchpad sender, TouchpadEventArgs arg);
12 | void TouchesEnded(DS4Touchpad sender, TouchpadEventArgs arg);
13 | void SixAxisMoved(DS4SixAxis sender, SixAxisEventArgs unused);
14 | void TouchUnchanged(DS4Touchpad sender, EventArgs unused);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/IoC/README.md:
--------------------------------------------------------------------------------
1 | # IoC
2 |
3 | Houses all services used via Dependency Injection.
4 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/OutputKBM/VirtualKBMMapping.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace DS4Windows.DS4Control
3 | {
4 | public abstract class VirtualKBMMapping
5 | {
6 | public uint MOUSEEVENTF_LEFTDOWN = 2, MOUSEEVENTF_LEFTUP = 4,
7 | MOUSEEVENTF_RIGHTDOWN = 8, MOUSEEVENTF_RIGHTUP = 16,
8 | MOUSEEVENTF_MIDDLEDOWN = 32, MOUSEEVENTF_MIDDLEUP = 64,
9 | MOUSEEVENTF_XBUTTONDOWN = 128, MOUSEEVENTF_XBUTTONUP = 256,
10 | MOUSEEVENTF_WHEEL = 0x0800, MOUSEEVENTF_HWHEEL = 0x1000;
11 |
12 | public uint KEY_TAB = 0x09, KEY_LALT = 0x12;
13 | public int WHEEL_TICK_DOWN = -120, WHEEL_TICK_UP = 120;
14 | public bool macroKeyTranslate = false;
15 |
16 | public abstract void PopulateConstants();
17 | public abstract void PopulateMappings();
18 | public abstract uint GetRealEventKey(uint winVkKey);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/BezierCurveConverter.cs:
--------------------------------------------------------------------------------
1 | using DS4Windows.Shared.Common.Types;
2 | using ExtendedXmlSerializer.ContentModel.Conversion;
3 |
4 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
5 | {
6 | ///
7 | /// (De-)serializes to and from XML.
8 | ///
9 | internal sealed class BezierCurveConverter : ConverterBase
10 | {
11 | private BezierCurveConverter()
12 | {
13 | }
14 |
15 | public static BezierCurveConverter Default { get; } = new();
16 |
17 | public override BezierCurve Parse(string data)
18 | {
19 | return string.IsNullOrEmpty(data)
20 | ? new BezierCurve()
21 | : new BezierCurve
22 | {
23 | CustomDefinition = data
24 | };
25 | }
26 |
27 | public override string Format(BezierCurve instance)
28 | {
29 | return instance.CustomDefinition;
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/DS4ColorConverter.cs:
--------------------------------------------------------------------------------
1 | using DS4Windows;
2 | using DS4Windows.Shared.Common.Types;
3 | using ExtendedXmlSerializer.ContentModel.Conversion;
4 |
5 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
6 | {
7 | ///
8 | /// (De-)serializes to and from XML.
9 | ///
10 | sealed class DS4ColorConverter : ConverterBase
11 | {
12 | public static DS4ColorConverter Default { get; } = new();
13 |
14 | DS4ColorConverter() {}
15 |
16 | public override DS4Color Parse(string data)
17 | {
18 | var colors = data.Split(',');
19 | var r = byte.Parse(colors[0]);
20 | var g = byte.Parse(colors[1]);
21 | var b = byte.Parse(colors[2]);
22 |
23 | return new DS4Color(r, g, b);
24 | }
25 |
26 | public override string Format(DS4Color instance)
27 | {
28 | return $"{instance.Red},{instance.Green},{instance.Blue}";
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/GuidConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using DS4Windows.Shared.Configuration.Profiles.Schema;
3 | using ExtendedXmlSerializer.ContentModel.Conversion;
4 |
5 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
6 | {
7 | ///
8 | /// (De-)serializes values.
9 | ///
10 | internal sealed class GuidConverter : ConverterBase
11 | {
12 | private GuidConverter()
13 | {
14 | }
15 |
16 | public static GuidConverter Default { get; } = new();
17 |
18 | public override Guid Parse(string data)
19 | {
20 | //
21 | // Trick to loop over legacy format, just report back the default profile ID
22 | //
23 | return Guid.TryParse(data, out var guid) ? guid : DS4WindowsProfile.DefaultProfileId;
24 | }
25 |
26 | public override string Format(Guid instance)
27 | {
28 | return instance.ToString();
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/IntegerListConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using ExtendedXmlSerializer.ContentModel.Conversion;
4 |
5 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
6 | {
7 | ///
8 | /// (De-)serializes a list of types.
9 | ///
10 | internal sealed class IntegerListConverterConverter : ConverterBase>
11 | {
12 | private IntegerListConverterConverter()
13 | {
14 | }
15 |
16 | public static IntegerListConverterConverter Default { get; } = new();
17 |
18 | public override List Parse(string data)
19 | {
20 | return data.Split(',').Select(int.Parse).ToList();
21 | }
22 |
23 | public override string Format(List instance)
24 | {
25 | return string.Join(",", instance);
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/PhysicalAddressConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Net.NetworkInformation;
2 | using DS4Windows.Shared.Common.Util;
3 | using DS4Windows.Shared.Devices.Util;
4 | using DS4WinWPF.DS4Control.Util;
5 | using ExtendedXmlSerializer.ContentModel.Conversion;
6 |
7 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
8 | {
9 | ///
10 | /// (De-)serializes values.
11 | ///
12 | internal sealed class PhysicalAddressConverter : ConverterBase
13 | {
14 | private PhysicalAddressConverter()
15 | {
16 | }
17 |
18 | public static PhysicalAddressConverter Default { get; } = new();
19 |
20 | public override PhysicalAddress Parse(string data)
21 | {
22 | return PhysicalAddress.Parse(data);
23 | }
24 |
25 | public override string Format(PhysicalAddress instance)
26 | {
27 | return instance.ToFriendlyName();
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/Profiles/Schema/Converters/VersionConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ExtendedXmlSerializer.ContentModel.Conversion;
3 |
4 | namespace DS4WinWPF.DS4Control.Profiles.Schema.Converters
5 | {
6 | ///
7 | /// (De-)serializes values.
8 | ///
9 | internal sealed class VersionConverter : ConverterBase
10 | {
11 | private VersionConverter()
12 | {
13 | }
14 |
15 | public static VersionConverter Default { get; } = new();
16 |
17 | public override Version Parse(string data)
18 | {
19 | //
20 | // Legacy format used integer which will fail to convert, just ignore
21 | //
22 | return Version.TryParse(data, out var version) ? version : new Version("0.0.0.0");
23 | }
24 |
25 | public override string Format(Version instance)
26 | {
27 | return instance.ToString();
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Control/ScpUtil.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net.NetworkInformation;
3 |
4 | namespace DS4Windows
5 | {
6 | public class SerialChangeArgs : EventArgs
7 | {
8 | public SerialChangeArgs(int index, PhysicalAddress serial)
9 | {
10 | Index = index;
11 | Serial = serial;
12 | }
13 |
14 | private int Index { get; }
15 | private PhysicalAddress Serial { get; }
16 | }
17 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/AxialStickUserControl.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 | using DS4Windows.Shared.Common.Types;
3 | using DS4WinWPF.DS4Forms.ViewModels;
4 |
5 | namespace DS4WinWPF.DS4Forms
6 | {
7 | ///
8 | /// Interaction logic for AxialStickUserControl.xaml
9 | ///
10 | public partial class AxialStickUserControl : UserControl
11 | {
12 | public AxialStickUserControl()
13 | {
14 | InitializeComponent();
15 | }
16 |
17 | public AxialStickControlViewModel AxialVM { get; private set; }
18 |
19 | public void UseDevice(StickDeadZoneInfo stickDeadInfo)
20 | {
21 | AxialVM = new AxialStickControlViewModel(stickDeadInfo);
22 | mainGrid.DataContext = AxialVM;
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/ColorPickerWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 | using System.Windows.Media;
3 | using AdonisUI.Controls;
4 |
5 | namespace DS4WinWPF.DS4Forms
6 | {
7 | ///
8 | /// Interaction logic for ColorPickerWindow.xaml
9 | ///
10 | public partial class ColorPickerWindow : AdonisWindow
11 | {
12 | public delegate void ColorChangedHandler(ColorPickerWindow sender, Color color);
13 |
14 | public ColorPickerWindow()
15 | {
16 | InitializeComponent();
17 | }
18 |
19 | public event ColorChangedHandler ColorChanged;
20 |
21 | private void ColorPicker_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs e)
22 | {
23 | ColorChanged?.Invoke(this, e.NewValue.GetValueOrDefault());
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/Converters/EscapeAccessKeysConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Globalization;
3 | using System.Text.RegularExpressions;
4 | using System.Windows.Data;
5 |
6 | namespace DS4WinWPF.DS4Forms.Converters
7 | {
8 | public class EscapeAccessKeysConverter : IValueConverter
9 | {
10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
11 | {
12 | string temp = value.ToString();
13 | temp = Regex.Replace(temp, "_{1}", "__");
14 | return temp;
15 | }
16 |
17 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
18 | {
19 | string temp = value.ToString();
20 | temp = Regex.Replace(temp, "_{2}", "_");
21 | return temp;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/RecordBoxWindow.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/RecordBoxWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using DS4Windows.Shared.Common.Legacy;
4 |
5 | namespace DS4WinWPF.DS4Forms
6 | {
7 | ///
8 | /// Interaction logic for RecordBoxWindow.xaml
9 | ///
10 | public partial class RecordBoxWindow : Window
11 | {
12 | public RecordBoxWindow(int deviceNum, DS4ControlSettingsV3 settings, bool repeatable = true)
13 | {
14 | InitializeComponent();
15 |
16 | var box = new RecordBox(deviceNum, settings, false, repeatable: repeatable);
17 | mainPanel.Children.Add(box);
18 |
19 | box.Save += RecordBox_Save;
20 | box.Cancel += Box_Cancel;
21 | }
22 |
23 | public event EventHandler Saved;
24 |
25 | private void Box_Cancel(object sender, EventArgs e)
26 | {
27 | Close();
28 | }
29 |
30 | private void RecordBox_Save(object sender, EventArgs e)
31 | {
32 | Saved?.Invoke(this, EventArgs.Empty);
33 | Close();
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/ViewModels/MainWindowsViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace DS4WinWPF.DS4Forms.ViewModels
4 | {
5 | public class MainWindowsViewModel
6 | {
7 | private bool fullTabsEnabled = true;
8 |
9 | public string updaterExe = Environment.Is64BitProcess ? "DS4Updater.exe" : "DS4Updater_x86.exe";
10 |
11 | public bool FullTabsEnabled
12 | {
13 | get => fullTabsEnabled;
14 | set
15 | {
16 | fullTabsEnabled = value;
17 | FullTabsEnabledChanged?.Invoke(this, EventArgs.Empty);
18 | }
19 | }
20 |
21 | public event EventHandler FullTabsEnabledChanged;
22 | }
23 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/ViewModels/RenameProfileViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using DS4Windows;
4 | using DS4Windows.Shared.Common.Attributes;
5 |
6 | namespace DS4WinWPF.DS4Forms.ViewModels
7 | {
8 | public class RenameProfileViewModel
9 | {
10 | private string profileName;
11 | public string ProfileName
12 | {
13 | get => profileName;
14 | set
15 | {
16 | profileName = value;
17 | ProfileNameChanged?.Invoke(this, EventArgs.Empty);
18 | }
19 | }
20 | public event EventHandler ProfileNameChanged;
21 |
22 | [ConfigurationSystemComponent]
23 | public bool ProfileFileExists()
24 | {
25 | string filePath = Path.Combine(Global.RuntimeAppDataPath,
26 | "Profiles", $"{profileName}.xml");
27 | return File.Exists(filePath);
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/DS4Windows/DS4Forms/ViewModels/Util/EnumChoiceSelection.cs:
--------------------------------------------------------------------------------
1 | namespace DS4WinWPF.DS4Forms.ViewModels.Util
2 | {
3 | public class EnumChoiceSelection
4 | {
5 | public EnumChoiceSelection(string name, T currentValue)
6 | {
7 | DisplayName = name;
8 | ChoiceValue = currentValue;
9 | }
10 |
11 | public string DisplayName { get; }
12 |
13 | public T ChoiceValue { get; set; }
14 | }
15 | }
--------------------------------------------------------------------------------
/DS4Windows/DS4W.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/DS4W.ico
--------------------------------------------------------------------------------
/DS4Windows/DS4Windows.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/DS4Windows.ico
--------------------------------------------------------------------------------
/DS4Windows/DateTimeJsonConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Text.Json;
4 | using System.Text.Json.Serialization;
5 |
6 | namespace DS4WinWPF
7 | {
8 | public class DateTimeJsonConverter
9 | {
10 | public class DateTimeConverterUsingDateTimeParse : JsonConverter
11 | {
12 | public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
13 | {
14 | Debug.Assert(typeToConvert == typeof(DateTime));
15 | return DateTime.Parse(reader.GetString());
16 | }
17 |
18 | public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
19 | {
20 | writer.WriteStringValue(value.ToString());
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/DS4Windows/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/DS4Windows/HidLibrary/Extensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Text;
3 |
4 | namespace DS4Windows
5 | {
6 | [Obsolete]
7 | public static class Extensions
8 | {
9 | public static string ToUTF8String(this byte[] buffer)
10 | {
11 | var value = Encoding.UTF8.GetString(buffer);
12 | return value.Remove(value.IndexOf((char)0));
13 | }
14 |
15 | public static string ToUTF16String(this byte[] buffer)
16 | {
17 | var value = Encoding.Unicode.GetString(buffer);
18 | return value.Remove(value.IndexOf((char)0));
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/DS4Windows/HidLibrary/HidDeviceAttributes.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace DS4Windows
4 | {
5 | [Obsolete]
6 | public class HidDeviceAttributes
7 | {
8 | internal HidDeviceAttributes(NativeMethods.HIDD_ATTRIBUTES attributes)
9 | {
10 | VendorId = attributes.VendorID;
11 | ProductId = attributes.ProductID;
12 | Version = attributes.VersionNumber;
13 |
14 | VendorHexId = "0x" + attributes.VendorID.ToString("X4");
15 | ProductHexId = "0x" + attributes.ProductID.ToString("X4");
16 | }
17 |
18 | public int VendorId { get; private set; }
19 | public int ProductId { get; private set; }
20 | public int Version { get; private set; }
21 | public string VendorHexId { get; set; }
22 | public string ProductHexId { get; set; }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/DS4Windows/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 |
4 | [assembly: ThemeInfo(
5 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
6 | //(used if a resource is not found in the page,
7 | // or application resource dictionaries)
8 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
9 | //(used if a resource is not found in the page,
10 | // app, or any theme specific resource dictionaries)
11 | )]
12 |
--------------------------------------------------------------------------------
/DS4Windows/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/DS4Windows/README.md:
--------------------------------------------------------------------------------
1 | # Original DS4Windows project (Ryochan7 origin)
2 |
3 | Here is a partially rewritten and redesigned fork of DS4Windows used as a reference on which features to port over. It's not encouraged to invest in modifications in this project but focus on the main solution instead.
4 |
--------------------------------------------------------------------------------
/DS4Windows/Resources/360 fades.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/360 fades.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/360 highlight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/360 highlight.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/360 map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/360 map.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/A.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/A.PNG
--------------------------------------------------------------------------------
/DS4Windows/Resources/B.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/B.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/BACK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/BACK.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/BT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/BT.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/BT_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/BT_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DOWN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DOWN.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4 Config.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4 Config.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4 Config_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4 Config_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4 Controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4 Controller.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4 lightbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4 lightbar.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Circle.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Cross.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Cross.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Down.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_L1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_L1.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_L2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_L2.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_LS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_LS.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Left.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_PS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_PS.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_R1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_R1.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_R2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_R2.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_RS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_RS.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Right.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Share.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Share.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Square.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Square.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_TouchLeft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_TouchLeft.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_TouchMulti.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_TouchMulti.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_TouchRight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_TouchRight.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_TouchUpper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_TouchUpper.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Triangle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Triangle.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_Up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_Up.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4-Config_options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4-Config_options.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4.ico
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4W - Black.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4W - Black.ico
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4W - White.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4W - White.ico
--------------------------------------------------------------------------------
/DS4Windows/Resources/DS4W.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/DS4W.ico
--------------------------------------------------------------------------------
/DS4Windows/Resources/LB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LB.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LEFT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LEFT.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LS.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LSD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LSD.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LSL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LSL.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LSR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LSR.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LSU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LSU.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/LT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/LT.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/Pairmode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/Pairmode.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RB.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RIGHT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RIGHT.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RS.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RSD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RSD.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RSL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RSL.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RSR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RSR.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RSU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RSU.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/RT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/RT.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/Red Circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/Red Circle.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/START.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/START.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/UP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/UP.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/USB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/USB.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/USB_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/USB_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/UpperTouch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/UpperTouch.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/X.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/X.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/Y.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/Y.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/cancel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/cancel.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/cancel_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/cancel_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/checked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/checked.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/checked_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/checked_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/clock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/clock.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/clock_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/clock_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/copy.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/copy_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/copy_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/delete.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/delete_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/delete_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/edit.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/edit_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/edit_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/export.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/export.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/export_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/export_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/import.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/import.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/import_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/import_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/key-solid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/key-solid.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/key-solid_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/key-solid_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/keydown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/keydown.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/keydown_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/keydown_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/keyup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/keyup.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/keyup_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/keyup_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/left touch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/left touch.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/mouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/mouse.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/newprofile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/newprofile.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/newprofile_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/newprofile_white.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/none.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/none.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/rainbow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/rainbow.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/rainbowC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/rainbowC.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/rainbowCCrop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/rainbowCCrop.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/right touch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/right touch.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/saveprofile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/saveprofile.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/size.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/size.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/GitHub-Mark-64px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/GitHub-Mark-64px.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/GitHub-Mark-Light-64px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/GitHub-Mark-Light-64px.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/bittube.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/bittube.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/mastodon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/mastodon.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/minds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/minds.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/twitter_logo_initial.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/twitter_logo_initial.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/social/youtube_social_icon_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/social/youtube_social_icon_red.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/x360test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/x360test.png
--------------------------------------------------------------------------------
/DS4Windows/Resources/xbox_360_controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Resources/xbox_360_controller.png
--------------------------------------------------------------------------------
/DS4Windows/Splashscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/Splashscreen.png
--------------------------------------------------------------------------------
/DS4Windows/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "Serilog": {
10 | "MinimumLevel": "Verbose",
11 | "Using": [ "Serilog.Sinks.File" ],
12 | "WriteTo": [
13 | {
14 | "Name": "File",
15 | "Args": {
16 | "path": "Logs\\DS4Windows-.log",
17 | "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}",
18 | "rollingInterval": "Day"
19 | }
20 | }
21 | ]
22 | },
23 | "OpenTelemetry": {
24 | "IsTracingEnabled": true
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/DS4Windows/libs/x64/FakerInputWrapper/FakerInputDll.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x64/FakerInputWrapper/FakerInputDll.dll
--------------------------------------------------------------------------------
/DS4Windows/libs/x64/FakerInputWrapper/FakerInputWrapper.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x64/FakerInputWrapper/FakerInputWrapper.dll
--------------------------------------------------------------------------------
/DS4Windows/libs/x64/Nefarius.ViGEm.Client/Nefarius.ViGEm.Client.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x64/Nefarius.ViGEm.Client/Nefarius.ViGEm.Client.dll
--------------------------------------------------------------------------------
/DS4Windows/libs/x86/FakerInputWrapper/FakerInputDll.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x86/FakerInputWrapper/FakerInputDll.dll
--------------------------------------------------------------------------------
/DS4Windows/libs/x86/FakerInputWrapper/FakerInputWrapper.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x86/FakerInputWrapper/FakerInputWrapper.dll
--------------------------------------------------------------------------------
/DS4Windows/libs/x86/Nefarius.ViGEm.Client/Nefarius.ViGEm.Client.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/DS4Windows/libs/x86/Nefarius.ViGEm.Client/Nefarius.ViGEm.Client.dll
--------------------------------------------------------------------------------
/DS4Windows/newest.txt:
--------------------------------------------------------------------------------
1 | 3.0.18
2 |
--------------------------------------------------------------------------------
/Installer/AppVeyor_ProductKey.txt.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Installer/AppVeyor_ProductKey.txt.enc
--------------------------------------------------------------------------------
/Installer/Images/Vapour.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Installer/Images/Vapour.ico
--------------------------------------------------------------------------------
/NOTICE.txt:
--------------------------------------------------------------------------------
1 | This project includes the source code of some third party projects. This file
2 | will attempt to document some third party source code that is used in the
3 | DS4Windows source code and state the original source.
4 |
5 | Crc32:
6 | https://github.com/dariogriffo/Crc32
7 |
8 | Font Awesome:
9 | https://fontawesome.com/license
10 |
11 | 1€ Filter (C# version):
12 | http://cristal.univ-lille.fr/~casiez/1euro/OneEuroFilter.cs
13 |
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/Constants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Client.Core;
2 |
3 | public static class Constants
4 | {
5 | // TODO: use webserver to deliver this tool!
6 | [Obsolete]
7 | public static readonly string BezierCurveEditorPath = $"file:///{AppContext.BaseDirectory.Replace('\\', '/')}BezierCurveEditor/index.html";
8 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/DependencyInjection/IServiceRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | namespace Vapour.Client.Core.DependencyInjection;
5 |
6 | public interface IServiceRegistrar
7 | {
8 | void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services);
9 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/Vapour.Client.Core.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Vapour.Client.Core
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/View/IView.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Client.Core.View;
2 |
3 | public interface IView : IView where TView : IView
4 | {
5 | }
6 |
7 | public interface IView
8 | {
9 | object DataContext { get; set; }
10 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/ViewModel/INavigationTabViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Core.ViewModel;
4 |
5 | public interface INavigationTabViewModel : INavigationTabViewModel, IViewModel
6 | where TViewModel : INavigationTabViewModel
7 | where TView : IView
8 | {
9 | }
10 |
11 | public interface INavigationTabViewModel : IViewModel
12 | {
13 | int TabIndex { get; }
14 |
15 | string? Header { get; }
16 |
17 | Type GetViewType();
18 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/ViewModel/IViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 |
3 | using Vapour.Client.Core.View;
4 |
5 | namespace Vapour.Client.Core.ViewModel;
6 |
7 | public interface IViewModel : IViewModel, INotifyPropertyChanged, INotifyPropertyChanging, IDisposable
8 | where TViewModel : IViewModel
9 | {
10 | }
11 |
12 | public interface IViewModel
13 | {
14 | Task Initialize();
15 |
16 | void AddView(IView view);
17 |
18 | List Views { get; }
19 |
20 | object? MainView { get; }
21 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core.Interfaces/ViewModel/IViewModelFactory.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Core.ViewModel;
4 |
5 | public interface IViewModelFactory
6 | {
7 | Task> CreateNavigationTabViewModels();
8 |
9 | Task Create()
10 | where TViewModel : IViewModel
11 | where TView : IView;
12 |
13 | TView CreateView() where TView : IView;
14 |
15 | Task CreateViewModel() where TViewModel : IViewModel;
16 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core/DependencyInjection/RegistrarDiscovery.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | namespace Vapour.Client.Core.DependencyInjection;
5 |
6 | public static class RegistrarDiscovery
7 | {
8 | public static void RegisterRegistrars(IHostBuilder builder, HostBuilderContext context, IServiceCollection services,
9 | Type[] types)
10 | {
11 | foreach (Type type in types)
12 | {
13 | if (Activator.CreateInstance(type) is IServiceRegistrar instance)
14 | {
15 | services.AddSingleton(type, instance);
16 | services.AddSingleton(typeof(IServiceRegistrar), instance);
17 | instance.ConfigureServices(builder, context, services);
18 | }
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Client.Core/ViewModel/NavigationTabViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Core.ViewModel;
4 |
5 | public abstract class NavigationTabViewModel : ViewModel,
6 | INavigationTabViewModel
7 | where TViewModel : INavigationTabViewModel
8 | where TView : IView
9 | {
10 | public abstract int TabIndex { get; }
11 |
12 | public abstract string? Header { get; }
13 |
14 | public Type GetViewType()
15 | {
16 | return typeof(TView);
17 | }
18 | }
--------------------------------------------------------------------------------
/Vapour.Client.Core/ViewModel/ViewModelRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 |
6 | namespace Vapour.Client.Core.ViewModel;
7 |
8 | public class ViewModelRegistrar : IServiceRegistrar
9 | {
10 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
11 | {
12 | services.AddSingleton();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IAddGameListView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 |
5 | public interface IAddGameListView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IAddGameListViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Devices.Services.Configuration;
3 |
4 | namespace Vapour.Client.Modules.InputSource;
5 |
6 | public interface IAddGameListViewModel : IViewModel
7 | {
8 | Task Initialize(string inputSourceKey, GameSource gameSource, Func onCompleted);
9 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IGameConfigurationItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Common.Types;
3 | using Vapour.Shared.Devices.Services.Configuration;
4 |
5 | namespace Vapour.Client.Modules.InputSource;
6 |
7 | public interface IGameConfigurationItemViewModel : IViewModel
8 | {
9 | string GameId { get; }
10 |
11 | string GameName { get; }
12 |
13 | string GameSource { get; }
14 |
15 | bool IsPassThru { get; set; }
16 |
17 | OutputDeviceType OutputDeviceType { get; set; }
18 |
19 | string OutputGroupName { get; }
20 |
21 | void SetGameConfiguration(string inputSourceKey, InputSourceConfiguration configuration);
22 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceConfigureView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 |
5 | public interface IInputSourceConfigureView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceConfigureViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 | using Vapour.Client.Core.ViewModel;
3 |
4 | namespace Vapour.Client.Modules.InputSource;
5 |
6 | public interface IInputSourceConfigureViewModel : IViewModel
7 | {
8 | Task SetInputSourceToConfigure(IInputSourceItemViewModel inputSourceItemViewModel);
9 |
10 | IInputSourceItemViewModel InputSourceItem { get; }
11 |
12 | IView GameListView { get; }
13 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceControllerItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Media.Imaging;
2 |
3 | using Vapour.Client.Core.ViewModel;
4 |
5 | namespace Vapour.Client.Modules.InputSource;
6 |
7 | public interface IInputSourceControllerItemViewModel : IViewModel
8 | {
9 | string Serial { get; }
10 |
11 | BitmapImage DeviceImage { get; }
12 |
13 | string DisplayText { get; }
14 |
15 | BitmapImage ConnectionTypeImage { get; }
16 |
17 | decimal BatteryPercentage { get; }
18 |
19 | bool IsFiltered { get; set; }
20 |
21 | string InstanceId { get; set; }
22 |
23 | string ParentInstance { get; set; }
24 |
25 | string DeviceKey { get; set; }
26 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Media;
2 |
3 | using Vapour.Client.Core.ViewModel;
4 | using Vapour.Server.InputSource;
5 | using Vapour.Shared.Devices.Services.Configuration;
6 |
7 | namespace Vapour.Client.Modules.InputSource;
8 |
9 | public interface IInputSourceItemViewModel : IViewModel
10 | {
11 | Guid SelectedProfileId { get; set; }
12 |
13 | SolidColorBrush CurrentColor { get; set; }
14 |
15 | InputSourceConfiguration CurrentConfiguration { get; set; }
16 |
17 | bool ConfigurationSetFromUser { get; set; }
18 |
19 | string InputSourceKey { get; set; }
20 |
21 | List Controllers { get; set; }
22 |
23 | Task SetInputSource(InputSourceMessage inputSource);
24 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceListView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 |
5 | public interface IInputSourceListView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/InputSource/IInputSourceListViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 |
3 | using Vapour.Client.Core.ViewModel;
4 | using Vapour.Client.Modules.Profiles;
5 |
6 | namespace Vapour.Client.Modules.InputSource;
7 |
8 | public interface IInputSourceListViewModel : INavigationTabViewModel
9 | {
10 | ObservableCollection InputSourceItems { get; }
11 |
12 | ObservableCollection SelectableProfileItems { get; }
13 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Main/Constants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Client.Modules.Main;
2 |
3 | public static class Constants
4 | {
5 | public const string DialogHostName = "MainDialogHost";
6 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Main/IMainView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Main;
4 |
5 | public interface IMainView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Main/IMainViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 |
3 | using Vapour.Client.Core.ViewModel;
4 |
5 | namespace Vapour.Client.Modules.Main;
6 |
7 | public interface IMainViewModel : IViewModel
8 | {
9 | ObservableCollection NavigationItems { get; }
10 |
11 | IViewModel SelectedPage { get; set; }
12 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/IProfileEditView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | public interface IProfileEditView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/IProfileEditViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Configuration.Profiles.Schema;
3 |
4 | namespace Vapour.Client.Modules.Profiles.Edit;
5 |
6 | public interface IProfileEditViewModel : IViewModel
7 | {
8 | bool IsNew { get; }
9 |
10 | string Name { get; set; }
11 |
12 | IStickEditViewModel LeftStick { get; }
13 |
14 | IStickEditViewModel RightStick { get; }
15 |
16 | void SetProfile(IProfile profile, bool isNew = false);
17 |
18 | IProfile GetUpdatedProfile();
19 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/ISixAxisEditView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | public interface ISixAxisEditView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/ISixAxisEditViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Common.Types;
3 |
4 | namespace Vapour.Client.Modules.Profiles.Edit;
5 |
6 | public interface ISixAxisEditViewModel : IViewModel
7 | {
8 | double AntiDeadZone { get; set; }
9 |
10 | double MaxZone { get; set; }
11 |
12 | CurveMode OutputCurve { get; set; }
13 |
14 | BezierCurve CustomCurve { get; set; }
15 |
16 | double DeadZone { get; set; }
17 |
18 | double Sensitivity { get; set; }
19 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/IStickControlModeSettingsView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | public interface IStickControlModeSettingsView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/IStickEditView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | public interface IStickEditView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/IStickEditViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Common.Types;
3 |
4 | namespace Vapour.Client.Modules.Profiles.Edit;
5 |
6 | public interface IStickEditViewModel : IViewModel
7 | {
8 | StickMode OutputSettings { get; set; }
9 |
10 | IStickControlModeSettingsViewModel ControlModeSettings { get; }
11 |
12 | double FlickRealWorldCalibration { get; set; }
13 |
14 | double FlickThreshold { get; set; }
15 |
16 | double FlickTime { get; set; }
17 |
18 | double FlickMinAngleThreshold { get; set; }
19 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/ITriggerButtonsEditView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | public interface ITriggerButtonsEditView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/Edit/ITriggerButtonsEditViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Common.Types;
3 |
4 | namespace Vapour.Client.Modules.Profiles.Edit;
5 |
6 | public interface ITriggerButtonsEditViewModel : IViewModel
7 | {
8 | double DeadZoneConverted { get; set; }
9 |
10 | int AntiDeadZone { get; set; }
11 |
12 | int MaxZone { get; set; }
13 |
14 | int MaxOutput { get; set; }
15 |
16 | double Sensitivity { get; set; }
17 |
18 | int HipFireDelay { get; set; }
19 |
20 | CurveMode OutputCurve { get; set; }
21 |
22 | BezierCurve CustomCurve { get; set; }
23 |
24 | TwoStageTriggerMode TwoStageTriggerMode { get; set; }
25 |
26 | TriggerEffects TriggerEffect { get; set; }
27 |
28 | int DeadZone { get; set; }
29 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/IProfileListItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Media;
2 |
3 | using Vapour.Client.Core.ViewModel;
4 | using Vapour.Shared.Configuration.Profiles.Schema;
5 |
6 | namespace Vapour.Client.Modules.Profiles;
7 |
8 | public interface IProfileListItemViewModel : IViewModel
9 | {
10 | Guid Id { get; }
11 |
12 | string Name { get; }
13 |
14 | string OutputControllerType { get; }
15 |
16 | SolidColorBrush LightbarColor { get; }
17 |
18 | string TouchpadMode { get; }
19 |
20 | string GyroMode { get; }
21 |
22 | void SetProfile(IProfile profile);
23 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/IProfilesView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Profiles;
4 |
5 | public interface IProfilesView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/IProfilesViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 |
3 | namespace Vapour.Client.Modules.Profiles;
4 |
5 | public interface IProfilesViewModel : INavigationTabViewModel
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Profiles/ISelectableProfileItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Configuration.Profiles.Schema;
3 |
4 | namespace Vapour.Client.Modules.Profiles;
5 |
6 | public interface ISelectableProfileItemViewModel : IViewModel
7 | {
8 | string Name { get; }
9 |
10 | Guid Id { get; }
11 |
12 | void SetProfile(IProfile profile);
13 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Settings/ISettingsView.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.View;
2 |
3 | namespace Vapour.Client.Modules.Settings;
4 |
5 | public interface ISettingsView : IView
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Settings/ISettingsViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 |
3 | namespace Vapour.Client.Modules.Settings;
4 |
5 | public interface ISettingsViewModel : INavigationTabViewModel
6 | {
7 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules.Interfaces/Vapour.Client.Modules.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Vapour.Client.Modules
5 | true
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/BezierCurveEditor/build.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/BezierCurveEditor/build.js
--------------------------------------------------------------------------------
/Vapour.Client.Modules/BezierCurveEditor/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Bezier Curve Editor for DS4Windows
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/AddGameListView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 | ///
5 | /// Interaction logic for AddGameListView.xaml
6 | ///
7 | public partial class AddGameListView : UserControl, IAddGameListView
8 | {
9 | public AddGameListView()
10 | {
11 | InitializeComponent();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/ControllerDisplayView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 | ///
5 | /// Interaction logic for ControllerDisplayView.xaml
6 | ///
7 | public partial class ControllerDisplayView : UserControl
8 | {
9 | public ControllerDisplayView()
10 | {
11 | InitializeComponent();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Converters/ComparisonConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Globalization;
2 | using System.Windows.Data;
3 |
4 | namespace Vapour.Client.Modules.InputSource.Converters;
5 |
6 | public sealed class ComparisonConverter : IValueConverter
7 | {
8 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
9 | {
10 | return value?.Equals(parameter);
11 | }
12 |
13 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
14 | {
15 | return value?.Equals(true) == true ? parameter : Binding.DoNothing;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/BT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/BT.png
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/BT_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/BT_white.png
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/DualSense.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/DualSense.jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/DualShock 4 v1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/DualShock 4 v1.jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/DualShock 4 v2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/DualShock 4 v2.jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/JoyCon (L).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/JoyCon (L).jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/JoyCon (R).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/JoyCon (R).jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/Steam Deck.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/Steam Deck.jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/Switch Pro.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/Switch Pro.jpg
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/USB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/USB.png
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/Images/USB_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/InputSource/Images/USB_white.png
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/InputSourceConfigureView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 | ///
5 | /// Interaction logic for InputSourceConfigureView.xaml
6 | ///
7 | public partial class InputSourceConfigureView : UserControl, IInputSourceConfigureView
8 | {
9 | public InputSourceConfigureView()
10 | {
11 | InitializeComponent();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/InputSource/InputSourceListView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.InputSource;
4 |
5 | ///
6 | /// Interaction logic for InputSourceListView.xaml
7 | ///
8 | public partial class InputSourceListView : UserControl, IInputSourceListView
9 | {
10 | public InputSourceListView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Main/Images/DS4W.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/Main/Images/DS4W.ico
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Main/Images/Vapour.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Modules/Main/Images/Vapour.ico
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Main/MainModuleRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 |
6 | namespace Vapour.Client.Modules.Main;
7 |
8 | public sealed class MainModuleRegistrar : IServiceRegistrar
9 | {
10 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
11 | {
12 | services.AddSingleton();
13 | services.AddSingleton();
14 | }
15 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Main/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using MaterialDesignExtensions.Controls;
2 |
3 | namespace Vapour.Client.Modules.Main;
4 |
5 | ///
6 | /// Interaction logic for MainWindow.xaml
7 | ///
8 | public partial class MainWindow : MaterialWindow, IMainView
9 | {
10 | public MainWindow()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Converters/BezierCurveConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Globalization;
2 | using System.Windows.Data;
3 |
4 | using Vapour.Shared.Common.Types;
5 |
6 | namespace Vapour.Client.Modules.Profiles.Converters;
7 |
8 | public class BezierCurveConverter : IValueConverter
9 | {
10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
11 | {
12 | var bezierCurve = (BezierCurve)value;
13 | return bezierCurve?.AsString;
14 | }
15 |
16 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
17 | {
18 | if (value == null)
19 | {
20 | return null;
21 | }
22 | else
23 | {
24 | var bezierCurve = new BezierCurve();
25 | bezierCurve.InitBezierCurve((string)value, BezierCurve.AxisType.LSRS, true);
26 | return bezierCurve;
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Edit/ProfileEditView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | ///
6 | /// Interaction logic for ProfileEditView.xaml
7 | ///
8 | public partial class ProfileEditView : UserControl, IProfileEditView
9 | {
10 | public ProfileEditView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Edit/SixAxisEditView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | ///
6 | /// Interaction logic for SixAxisEditView.xaml
7 | ///
8 | public partial class SixAxisEditView : UserControl, ISixAxisEditView
9 | {
10 | public SixAxisEditView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Edit/StickControlModeSettingsView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | ///
6 | /// Interaction logic for StickControlModeSettings.xaml
7 | ///
8 | public partial class StickControlModeSettingsView : UserControl, IStickControlModeSettingsView
9 | {
10 | public StickControlModeSettingsView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Edit/StickEditView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | ///
6 | /// Interaction logic for StickEditView.xaml
7 | ///
8 | public partial class StickEditView : UserControl, IStickEditView
9 | {
10 | public StickEditView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/Edit/TriggerButtonsEditView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles.Edit;
4 |
5 | ///
6 | /// Interaction logic for TriggerButtonsEditView.xaml
7 | ///
8 | public partial class TriggerButtonsEditView : UserControl, ITriggerButtonsEditView
9 | {
10 | public TriggerButtonsEditView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/ProfilesView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Profiles;
4 |
5 | ///
6 | /// Interaction logic for ProfilesView.xaml
7 | ///
8 | public partial class ProfilesView : UserControl, IProfilesView
9 | {
10 | public ProfilesView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Profiles/SelectableProfileItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Client.Core.ViewModel;
2 | using Vapour.Shared.Configuration.Profiles.Schema;
3 |
4 | namespace Vapour.Client.Modules.Profiles;
5 |
6 | public sealed class SelectableProfileItemViewModel :
7 | ViewModel,
8 | ISelectableProfileItemViewModel
9 | {
10 | public string Name { get; private set; }
11 |
12 | public Guid Id { get; private set; }
13 |
14 | public void SetProfile(IProfile profile)
15 | {
16 | Name = profile.DisplayName;
17 | Id = profile.Id;
18 | }
19 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Settings/InstallFilterDriverWarning.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Settings;
4 |
5 | ///
6 | /// Interaction logic for InstallFilterDriverWarning.xaml
7 | ///
8 | public partial class InstallFilterDriverWarning : UserControl
9 | {
10 | public InstallFilterDriverWarning()
11 | {
12 | InitializeComponent();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Settings/SettingsModuleRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 | using Vapour.Client.Core.ViewModel;
6 |
7 | namespace Vapour.Client.Modules.Settings;
8 |
9 | public sealed class SettingsModuleRegistrar : IServiceRegistrar
10 | {
11 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
12 | {
13 | services.AddSingletons(typeof(ISettingsViewModel), typeof(INavigationTabViewModel));
14 | services.AddSingleton();
15 | }
16 | }
--------------------------------------------------------------------------------
/Vapour.Client.Modules/Settings/SettingsView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.Modules.Settings;
4 |
5 | ///
6 | /// Interaction logic for SettingsView.xaml
7 | ///
8 | public partial class SettingsView : UserControl, ISettingsView
9 | {
10 | public SettingsView()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LargeTile.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LargeTile.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LargeTile.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LargeTile.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LargeTile.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LargeTile.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LargeTile.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LargeTile.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LargeTile.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LargeTile.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/LockScreenLogo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/LockScreenLogo.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SmallTile.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SmallTile.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SmallTile.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SmallTile.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SmallTile.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SmallTile.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SmallTile.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SmallTile.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SmallTile.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SmallTile.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SplashScreen.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SplashScreen.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SplashScreen.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SplashScreen.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SplashScreen.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SplashScreen.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SplashScreen.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SplashScreen.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/SplashScreen.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/SplashScreen.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Splashscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Splashscreen.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square150x150Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square150x150Logo.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square150x150Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square150x150Logo.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square150x150Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square150x150Logo.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square150x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square150x150Logo.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square150x150Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square150x150Logo.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-16.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-256.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-32.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.altform-unplated_targetsize-48.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-16.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-24.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-256.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-32.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Square44x44Logo.targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Square44x44Logo.targetsize-48.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.backup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.backup.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/StoreLogo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/StoreLogo.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Wide310x150Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Wide310x150Logo.scale-100.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Wide310x150Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Wide310x150Logo.scale-125.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Wide310x150Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Wide310x150Logo.scale-150.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Wide310x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Wide310x150Logo.scale-200.png
--------------------------------------------------------------------------------
/Vapour.Client.Package/Images/Wide310x150Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.Package/Images/Wide310x150Logo.scale-400.png
--------------------------------------------------------------------------------
/Vapour.Client.ServiceClients.Interfaces/IProfileServiceClient.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 |
3 | using Vapour.Shared.Configuration.Profiles.Schema;
4 |
5 | namespace Vapour.Client.ServiceClients;
6 |
7 | public interface IProfileServiceClient
8 | {
9 | Task Initialize();
10 |
11 | ObservableCollection ProfileList { get; }
12 |
13 | Task CreateNewProfile();
14 |
15 | Task DeleteProfile(Guid id);
16 |
17 | Task SaveProfile(IProfile profile);
18 |
19 | void StartListening(CancellationToken ct = default);
20 | }
--------------------------------------------------------------------------------
/Vapour.Client.ServiceClients.Interfaces/Vapour.Client.ServiceClients.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Vapour.Client.ServiceClients
5 | true
6 | True
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/Converters/Converters/ComparisonConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Globalization;
2 | using System.Windows.Data;
3 |
4 | namespace Vapour.Client.TrayApplication.Converters.Converters;
5 | public class ComparisonConverter : IValueConverter
6 | {
7 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
8 | {
9 | return value?.Equals(parameter);
10 | }
11 |
12 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
13 | {
14 | return value?.Equals(true) == true ? parameter : Binding.DoNothing;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/InputSourceListView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | using Vapour.Client.Core.View;
4 |
5 | namespace Vapour.Client.TrayApplication
6 | {
7 | public interface IInputSourceListView : IView
8 | {
9 | }
10 |
11 | ///
12 | /// Interaction logic for InputSourceListView.xaml
13 | ///
14 | public partial class InputSourceListView : UserControl, IInputSourceListView
15 | {
16 | public InputSourceListView()
17 | {
18 | InitializeComponent();
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/TrayApplicationRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 |
6 | namespace Vapour.Client.TrayApplication;
7 |
8 | public class TrayApplicationRegistrar : IServiceRegistrar
9 | {
10 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
11 | {
12 | services.AddSingleton();
13 | services.AddSingleton();
14 | }
15 | }
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/TrayPopup.xaml:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/TrayPopup.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Controls;
2 |
3 | namespace Vapour.Client.TrayApplication;
4 |
5 | ///
6 | /// Interaction logic for TrayPopup.xaml
7 | ///
8 | public partial class TrayPopup : UserControl
9 | {
10 | public TrayPopup()
11 | {
12 | InitializeComponent();
13 | }
14 | }
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/Vapour.Client.TrayApplication.appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "Serilog": {
10 | "MinimumLevel": "Verbose",
11 | "Using": [ "Serilog.Sinks.File" ],
12 | "WriteTo": [
13 | {
14 | "Name": "File",
15 | "Args": {
16 | "path": "Logs\\DS4Windows-Tray.log",
17 | "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}",
18 | "rollingInterval": "Day"
19 | }
20 | }
21 | ]
22 | },
23 | "OpenTelemetry": {
24 | "IsTracingEnabled": true
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Vapour.Client.TrayApplication/Vapour.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client.TrayApplication/Vapour.ico
--------------------------------------------------------------------------------
/Vapour.Client/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Client/Vapour.appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "Serilog": {
10 | "MinimumLevel": "Verbose",
11 | "Using": [ "Serilog.Sinks.File" ],
12 | "WriteTo": [
13 | {
14 | "Name": "File",
15 | "Args": {
16 | "path": "Logs\\Vapour-Client.log",
17 | "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}",
18 | "rollingInterval": "Day"
19 | }
20 | }
21 | ]
22 | },
23 | "OpenTelemetry": {
24 | "IsTracingEnabled": true
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Vapour.Client/Vapour.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/Vapour.Client/Vapour.ico
--------------------------------------------------------------------------------
/Vapour.Server.Host/.config/dotnet-tools.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "isRoot": true,
4 | "tools": {
5 | "dotnet-ef": {
6 | "version": "6.0.5",
7 | "commands": [
8 | "dotnet-ef"
9 | ]
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/Vapour.Server.Host/InputSource/InputSourceMessageHub.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.SignalR;
2 |
3 | using Vapour.Server.InputSource;
4 |
5 | namespace Vapour.Server.Host.InputSource;
6 |
7 | ///
8 | /// SignalR hub to exchange input source events.
9 | ///
10 | public sealed class InputSourceMessageHub : Hub
11 | {
12 | }
13 |
--------------------------------------------------------------------------------
/Vapour.Server.Host/NativeMethods.txt:
--------------------------------------------------------------------------------
1 | WTSGetActiveConsoleSessionId
2 | WTSQuerySessionInformation
3 | WTSFreeMemory
4 | WTS_INFO_CLASS
5 | WTSQueryUserToken
6 | GetTokenInformation
7 | TOKEN_USER
8 | ConvertSidToStringSid
--------------------------------------------------------------------------------
/Vapour.Server.Host/Profile/ProfileMessageForwarder.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.SignalR;
2 |
3 | using Vapour.Server.Profile;
4 | using Vapour.Shared.Configuration.Profiles.Services;
5 |
6 | namespace Vapour.Server.Host.Profile;
7 |
8 | public sealed class ProfileMessageForwarder : IProfileMessageForwarder
9 | {
10 | public ProfileMessageForwarder(IProfilesService profilesService,
11 | IHubContext hubContext)
12 | {
13 |
14 | }
15 | }
--------------------------------------------------------------------------------
/Vapour.Server.Host/Profile/ProfileMessageHub.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.SignalR;
2 |
3 | using Vapour.Server.Profile;
4 |
5 | namespace Vapour.Server.Host.Profile;
6 |
7 | ///
8 | /// SignalR hub to exchange profile events.
9 | ///
10 | public sealed class ProfileMessageHub : Hub
11 | {
12 | }
13 |
--------------------------------------------------------------------------------
/Vapour.Server.Host/Program.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Server.Host;
2 |
3 | await ServiceStartup.Start(args);
--------------------------------------------------------------------------------
/Vapour.Server.Host/System/SystemMessageForwarder.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.SignalR;
2 |
3 | using Vapour.Server.System;
4 |
5 | namespace Vapour.Server.Host.System;
6 |
7 | ///
8 | public sealed class SystemMessageForwarder : ISystemMessageForwarder
9 | {
10 | private readonly IHubContext _hubContext;
11 |
12 | public SystemMessageForwarder(IHubContext hubContext)
13 | {
14 | _hubContext = hubContext;
15 | }
16 |
17 | public async Task SendIsHostRunning(bool isRunning)
18 | {
19 | await _hubContext.Clients.All.IsHostRunningChanged(new IsHostRunningChangedMessage { IsRunning = isRunning });
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Vapour.Server.Host/System/SystemMessageHub.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.SignalR;
2 |
3 | using Vapour.Server.System;
4 |
5 | namespace Vapour.Server.Host.System;
6 | public sealed class SystemMessageHub : Hub
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/Vapour.Server.Host/Usings.cs:
--------------------------------------------------------------------------------
1 | global using System;
2 | global using FastEndpoints;
--------------------------------------------------------------------------------
/Vapour.Server.Host/Vapour.Server.Host.appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "Serilog": {
10 | "MinimumLevel": "Verbose",
11 | "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Console" ],
12 | "WriteTo": [
13 | {
14 | "Name": "Console",
15 | "Args": {
16 | "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Literate, Serilog.Sinks.Console",
17 | "applyThemeToRedirectedOutput": true
18 | }
19 | },
20 | {
21 | "Name": "File",
22 | "Args": {
23 | "path": "Logs\\Vapour-Server-.log",
24 | "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}",
25 | "rollingInterval": "Day"
26 | }
27 | }
28 | ]
29 | },
30 | "OpenTelemetry": {
31 | "IsTracingEnabled": true,
32 | "IsMetricsEnabled": true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Vapour.Server.Host/runsdvui.cmd:
--------------------------------------------------------------------------------
1 | cd /d "C:\Dev\DS4Windows\DS4Windows.Server.Host" &msbuild "DS4Windows.Server.Host.csproj" /t:sdvViewer /p:configuration="Debug" /p:platform="Any CPU" /p:SolutionDir="C:\Dev\DS4Windows"
2 | exit %errorlevel%
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/Configuration/GameListRequest.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.Configuration;
2 |
3 | namespace Vapour.Server.InputSource.Configuration;
4 | public class GameListRequest
5 | {
6 | public string InputSourceKey { get; set; }
7 | public GameSource GameSource { get; set; }
8 | }
9 |
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/Configuration/InputSourceConfigurationChangedMessage.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.Configuration;
2 |
3 | namespace Vapour.Server.InputSource.Configuration;
4 | public class InputSourceConfigurationChangedMessage
5 | {
6 | public string InputSourceKey { get; set; }
7 | public InputSourceConfiguration InputSourceConfiguration { get; set; }
8 | }
9 |
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/Configuration/InputSourceSetConfigRequest.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.Configuration;
2 |
3 | namespace Vapour.Server.InputSource.Configuration;
4 |
5 | public sealed class InputSourceSetConfigRequest
6 | {
7 | public string InputSourceKey { get; init; }
8 |
9 | public InputSourceConfiguration InputSourceConfiguration { get; init; }
10 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/Configuration/SaveInputSourceGameConfigurationRequest.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.Configuration;
2 |
3 | namespace Vapour.Server.InputSource.Configuration;
4 | public class SaveInputSourceGameConfigurationRequest
5 | {
6 | public string InputSourceKey { get; set; }
7 | public GameInfo GameInfo { get; set; }
8 | public InputSourceConfiguration InputSourceConfiguration { get; set; }
9 | }
10 |
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/IInputSourceMessageClient.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Server.InputSource.Configuration;
2 |
3 | namespace Vapour.Server.InputSource;
4 |
5 | ///
6 | /// Describes input source events exchangeable between client and server.
7 | ///
8 | public interface IInputSourceMessageClient
9 | {
10 | Task InputSourceCreated(InputSourceMessage message);
11 |
12 | Task InputSourceRemoved(InputSourceRemovedMessage message);
13 |
14 | Task InputSourceConfigurationChanged(InputSourceConfigurationChangedMessage inputSourceConfiguration);
15 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/IInputSourceMessageForwarder.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services;
2 |
3 | namespace Vapour.Server.InputSource;
4 |
5 | ///
6 | /// Dispatches input source events to clients.
7 | ///
8 | public interface IInputSourceMessageForwarder
9 | {
10 | InputSourceMessage MapInputSourceCreated(IInputSource inputSource);
11 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/InputSourceController.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID;
2 |
3 | namespace Vapour.Server.InputSource;
4 | public class InputSourceController
5 | {
6 | public string Description { get; set; }
7 |
8 | public string DisplayName { get; set; }
9 |
10 | public string InstanceId { get; init; }
11 |
12 | public string ManufacturerString { get; set; }
13 |
14 | public string ParentInstance { get; init; }
15 |
16 | public string Path { get; set; }
17 |
18 | public string ProductString { get; set; }
19 |
20 | public string SerialNumberString { get; init; }
21 |
22 | public ConnectionType Connection { get; init; }
23 |
24 | public string DeviceKey { get; init; }
25 |
26 | public bool IsFiltered { get; set; }
27 |
28 | public int Vid { get; init; }
29 |
30 | public int Pid { get; init; }
31 | }
32 |
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/InputSourceMessage.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.Configuration;
2 |
3 | namespace Vapour.Server.InputSource;
4 |
5 | public sealed class InputSourceMessage
6 | {
7 | public List Controllers { get; set; }
8 | public InputSourceConfiguration CurrentConfiguration { get; set; }
9 | public string InputSourceKey { get; set; }
10 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/InputSourceRemovedMessage.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.InputSource;
2 |
3 | public sealed class InputSourceRemovedMessage
4 | {
5 | public string InputSourceKey { get; init; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/InputSource/ProfileChangedMessage.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.InputSource;
2 |
3 | public class ProfileChangedMessage
4 | {
5 | public string InputSourceKey { get; set; }
6 |
7 | public Guid OldProfileId { get; set; }
8 |
9 | public Guid NewProfileId { get; set; }
10 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/Profile/IProfileMessageClient.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.Profile;
2 |
3 | ///
4 | /// Describes profile events exchangeable between client and server.
5 | ///
6 | public interface IProfileMessageClient
7 | {
8 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/Profile/IProfileMessageForwarder.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.Profile;
2 |
3 | public interface IProfileMessageForwarder
4 | {
5 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/Profile/ProfileDeleteRequest.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.Profile;
2 |
3 | public sealed class ProfileDeleteRequest
4 | {
5 | public Guid ProfileId { get; set; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/System/ISystemMessageClient.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.System;
2 |
3 | ///
4 | /// Describes system events exchangeable between client and server.
5 | ///
6 | public interface ISystemMessageClient
7 | {
8 | Task IsHostRunningChanged(IsHostRunningChangedMessage message);
9 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/System/ISystemMessageForwarder.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.System;
2 |
3 | ///
4 | /// Dispatches system events to clients.
5 | ///
6 | public interface ISystemMessageForwarder
7 | {
8 | Task SendIsHostRunning(bool isRunning);
9 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/System/IsHostRunningChangedMessage.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.System;
2 |
3 | public sealed class IsHostRunningChangedMessage
4 | {
5 | public bool IsRunning { get; init; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/System/SystemFilterDriverStatusResponse.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.System;
2 |
3 | public class SystemFilterDriverStatusResponse
4 | {
5 | public bool IsDriverInstalled { get; set; }
6 |
7 | public bool IsFilteringEnabled { get; set; }
8 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/System/SystemHostStatusResponse.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Server.System;
2 |
3 | public sealed class SystemHostStatusResponse
4 | {
5 | ///
6 | /// Gets if the host is running.
7 | ///
8 | public bool IsRunning { get; init; }
9 | }
--------------------------------------------------------------------------------
/Vapour.Server.Interfaces/Vapour.Server.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Vapour.Server
5 |
6 |
7 |
8 |
9 |
10 | true
11 | CS1591
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Attributes/ConfigurationSystemComponentAttribute.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 |
3 | namespace Vapour.Shared.Common.Attributes;
4 |
5 | ///
6 | /// Attribute used to keep track of code loading from or writing to disk. Slap this attribute on every method reading,
7 | /// writing or modifying the current XML-based configuration system to ease finding sections required to migrate.
8 | ///
9 | [AttributeUsage(AttributeTargets.All)]
10 | [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
11 | public sealed class ConfigurationSystemComponentAttribute : Attribute
12 | {
13 | ///
14 | /// Instantiate attribute.
15 | ///
16 | /// Optional remark to add.
17 | public ConfigurationSystemComponentAttribute(string remark = null)
18 | {
19 | Remark = remark;
20 | }
21 |
22 | public string Remark { get; }
23 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Attributes/HighMemoryPressureAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Attributes;
2 |
3 | ///
4 | /// Flag components which cause high memory allocations.
5 | ///
6 | [AttributeUsage(AttributeTargets.All)]
7 | public class HighMemoryPressureAttribute : Attribute
8 | {
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Attributes/IntermediateSolutionAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Attributes;
2 |
3 | ///
4 | /// Attribute to tag sections that are volatile and will be replaced in the near future.
5 | ///
6 | [AttributeUsage(AttributeTargets.All)]
7 | public class IntermediateSolutionAttribute : Attribute
8 | {
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Attributes/LoggingComponentAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Attributes;
2 |
3 | ///
4 | /// Marks components that engage in logging.
5 | ///
6 | [AttributeUsage(AttributeTargets.All)]
7 | public class LoggingComponentAttribute : Attribute
8 | {
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Attributes/MissingLocalizationAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Attributes;
2 |
3 | ///
4 | /// Section misses localization for non-English locales.
5 | ///
6 | [AttributeUsage(AttributeTargets.All)]
7 | public class MissingLocalizationAttribute : Attribute
8 | {
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/DeviceValueConverters.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common;
2 |
3 | public class DeviceValueConverters : IDeviceValueConverters
4 | {
5 | public double DeadZoneIntToDouble(int inVal)
6 | {
7 | return Math.Round(inVal / 127d, 1);
8 | }
9 |
10 | public int DeadZoneDoubleToInt(double val)
11 | {
12 | return (int)Math.Round(val * 127d, 1);
13 | }
14 |
15 | public double RotationConvertFrom(double val)
16 | {
17 | return Math.Round(val * 180.0 / Math.PI);
18 | }
19 |
20 | public double RotationConvertTo(double val)
21 | {
22 | return val * Math.PI / 180.0;
23 | }
24 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/IDeviceValueConverters.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common;
2 |
3 | public interface IDeviceValueConverters
4 | {
5 | int DeadZoneDoubleToInt(double val);
6 |
7 | double DeadZoneIntToDouble(int inVal);
8 |
9 | double RotationConvertFrom(double val);
10 |
11 | double RotationConvertTo(double val);
12 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Legacy/ControlActionData.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Common.Types;
2 |
3 | namespace Vapour.Shared.Common.Legacy;
4 |
5 | public class ControlActionData
6 | {
7 | public X360ControlItem ActionButton;
8 |
9 | ///
10 | /// Store base mapping value. Uses Windows virtual key values as the base
11 | /// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
12 | ///
13 | public int ActionKey { get; set; }
14 |
15 | public int[] ActionMacro { get; set; } = new int[1];
16 |
17 | ///
18 | /// Alias to real value for current output KB+M event system.
19 | /// Allows skipping a translation call every frame
20 | ///
21 | public uint ActionAlias { get; set; } = 0;
22 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Services/IGlobalStateService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Services;
2 |
3 | ///
4 | /// Provides global properties that can change during runtime but will not be persisted to or restored from disk.
5 | ///
6 | public interface IGlobalStateService
7 | {
8 | ///
9 | /// Absolute path to roaming application directory in current user profile.
10 | ///
11 | string RoamingAppDataPath { get; }
12 |
13 | string CurrentUserName { get; set; }
14 |
15 | string LocalProfilesDirectory { get; }
16 |
17 | string LocalDefaultProfileLocation { get; }
18 |
19 | string LocalInputSourceConfigurationsLocation { get; }
20 |
21 | string LocalInputSourceGameConfigurationsLocation { get; }
22 |
23 | string CurrentUserSid { get; set; }
24 |
25 | void EnsureRoamingDataPath();
26 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Telemetry/TracingSources.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 |
3 | namespace Vapour.Shared.Common.Telemetry;
4 |
5 | ///
6 | /// Constants defining tracing sources.
7 | ///
8 | public static class TracingSources
9 | {
10 | ///
11 | /// Resolves the calling assembly's name.
12 | ///
13 | public static string AssemblyName => Assembly.GetCallingAssembly().GetName().Name;
14 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/AppThemeChoice.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum AppThemeChoice : uint
4 | {
5 | Default,
6 | Dark
7 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/BluetoothOutputReportMethod.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | ///
4 | /// Available Windows API to use to write to a wireless device.
5 | ///
6 | public enum BluetoothOutputReportMethod : uint
7 | {
8 | ///
9 | /// The WriteFile() function is used. This should be preferred. Apparently there are issues with BLE and the Microsoft
10 | /// Bluetooth stack not working in some scenarios? It's hard to find actual information online, so for now just prefer
11 | /// this and experiment.
12 | ///
13 | WriteFile,
14 |
15 | ///
16 | /// The HidD_SetOutputReport() function is used. This will invoke an IOCTL_HID_SET_OUTPUT_REPORT request and should be
17 | /// considered a blocking call until the request is answered by the remote hardware.
18 | ///
19 | HidD_SetOutputReport
20 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/CurveMode.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 |
3 | namespace Vapour.Shared.Common.Types;
4 |
5 | ///
6 | /// Possible Bezier Curve Modes.
7 | ///
8 | public enum CurveMode
9 | {
10 | [Description("Linear")] Linear = 0,
11 | [Description("Enhanced Precision")] EnhancedPrecision,
12 | [Description("Quadratic")] Quadratic,
13 | [Description("Cubic")] Cubic,
14 | [Description("Easeout Quad")] EaseoutQuad,
15 | [Description("Easeout Cubic")] EaseoutCubic,
16 | [Description("Custom")] Custom
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/DS4HapticState.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class DS4HapticState : IEquatable, ICloneable
4 | {
5 | public DS4LightbarState LightbarState { get; set; } = new();
6 | public DS4ForceFeedbackState RumbleState { get; set; } = new();
7 |
8 | public object Clone()
9 | {
10 | var state = (DS4HapticState)MemberwiseClone();
11 | state.LightbarState = (DS4LightbarState)LightbarState.Clone();
12 | state.RumbleState = (DS4ForceFeedbackState)RumbleState.Clone();
13 |
14 | return state;
15 | }
16 |
17 | public bool Equals(DS4HapticState other)
18 | {
19 | return LightbarState.Equals(other.LightbarState) &&
20 | RumbleState.Equals(other.RumbleState);
21 | }
22 |
23 | public bool IsLightBarSet()
24 | {
25 | return LightbarState.IsLightBarSet();
26 | }
27 |
28 | public bool IsRumbleSet()
29 | {
30 | return RumbleState.IsRumbleSet();
31 | }
32 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/DualSense/HapticIntensity.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types.DualSense;
2 |
3 | public enum HapticIntensity : uint
4 | {
5 | Low,
6 | Medium,
7 | High
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/GyroControlsInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class GyroControlsInfo
4 | {
5 | public const string DefaultTriggers = "-1";
6 | public const bool DefaultTriggerCond = true;
7 | public const bool DefaultTriggerTurns = true;
8 | public const bool DefaultTriggerToggle = false;
9 |
10 | public string Triggers { get; set; } = DefaultTriggers;
11 |
12 | public bool TriggerCond { get; set; } = DefaultTriggerCond;
13 |
14 | public bool TriggerTurns { get; set; } = DefaultTriggerTurns;
15 |
16 | public bool TriggerToggle { get; set; } = DefaultTriggerToggle;
17 |
18 | public void Reset()
19 | {
20 | Triggers = DefaultTriggers;
21 | TriggerCond = DefaultTriggerCond;
22 | TriggerTurns = DefaultTriggerTurns;
23 | TriggerToggle = DefaultTriggerToggle;
24 | }
25 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/GyroMouseSens.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class GyroMouseSens
4 | {
5 | public double MouseCoefficient { get; set; } = 0.012;
6 |
7 | public double MouseOffset { get; set; } = 0.2;
8 |
9 | public double MouseSmoothOffset { get; set; } = 0.2;
10 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/GyroOutMode.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum GyroOutMode : uint
4 | {
5 | None,
6 | Controls,
7 | Mouse,
8 | MouseJoystick,
9 | DirectionalSwipe,
10 | Passthru
11 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/LightbarMode.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum LightbarMode : uint
4 | {
5 | ///
6 | /// Unknown state.
7 | ///
8 | None,
9 | ///
10 | /// Application is in control of Lightbar appearance.
11 | ///
12 | DS4Win,
13 | ///
14 | /// Game is in control of Lightbar appearance.
15 | ///
16 | Passthru
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/LightbarSettingInfo.cs:
--------------------------------------------------------------------------------
1 |
2 |
3 | using System.Diagnostics.CodeAnalysis;
4 |
5 | using PropertyChanged;
6 |
7 | namespace Vapour.Shared.Common.Types;
8 |
9 | ///
10 | /// Lightbar behaviour settings.
11 | ///
12 | [AddINotifyPropertyChangedInterface]
13 | [SuppressMessage("ReSharper", "UnusedMember.Local")]
14 | [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
15 | [SuppressMessage("ReSharper", "UnusedMember.Global")]
16 | public class LightbarSettingInfo
17 | {
18 | public LightbarMode Mode { get; set; } = LightbarMode.DS4Win;
19 |
20 | public LightbarDS4WinInfo Ds4WinSettings { get; set; } = new();
21 |
22 | public event EventHandler ModeChanged;
23 |
24 | private void OnModeChanged()
25 | {
26 | ModeChanged?.Invoke(this, EventArgs.Empty);
27 | }
28 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/OneEuroFilter3D.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class OneEuroFilter3D
4 | {
5 | public const double DEFAULT_WHEEL_CUTOFF = 0.4;
6 | public const double DEFAULT_WHEEL_BETA = 0.2;
7 |
8 | public OneEuroFilter Axis1Filter { get; } = new(DEFAULT_WHEEL_CUTOFF, DEFAULT_WHEEL_BETA);
9 | public OneEuroFilter Axis2Filter { get; } = new(DEFAULT_WHEEL_CUTOFF, DEFAULT_WHEEL_BETA);
10 | public OneEuroFilter Axis3Filter { get; } = new(DEFAULT_WHEEL_CUTOFF, DEFAULT_WHEEL_BETA);
11 |
12 | public void SetFilterAttrs(double minCutoff, double beta)
13 | {
14 | Axis1Filter.MinCutoff = Axis2Filter.MinCutoff = Axis3Filter.MinCutoff = minCutoff;
15 | Axis1Filter.Beta = Axis2Filter.Beta = Axis3Filter.Beta = beta;
16 | }
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/OneEuroFilterPair.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class OneEuroFilterPair
4 | {
5 | public const double DEFAULT_WHEEL_CUTOFF = 0.1;
6 | public const double DEFAULT_WHEEL_BETA = 0.1;
7 |
8 | public OneEuroFilter Axis1Filter { get; } = new(DEFAULT_WHEEL_CUTOFF, DEFAULT_WHEEL_BETA);
9 | public OneEuroFilter Axis2Filter { get; } = new(DEFAULT_WHEEL_CUTOFF, DEFAULT_WHEEL_BETA);
10 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/OutputDeviceType.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum OutputDeviceType : uint
4 | {
5 | None = 0,
6 | Xbox360Controller,
7 | DualShock4Controller
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/SASteeringWheelEmulationAxisType.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum SASteeringWheelEmulationAxisType : byte
4 | {
5 | None = 0,
6 | LX,
7 | LY,
8 | RX,
9 | RY,
10 | L2R2,
11 | VJoy1X,
12 | VJoy1Y,
13 | VJoy1Z,
14 | VJoy2X,
15 | VJoy2Y,
16 | VJoy2Z
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/SpecialAction.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/SquareStickInfo.cs:
--------------------------------------------------------------------------------
1 | using PropertyChanged;
2 |
3 | namespace Vapour.Shared.Common.Types;
4 |
5 | [AddINotifyPropertyChangedInterface]
6 | public class SquareStickInfo
7 | {
8 | public const double DefaultSquareStickRoundness = 5.0;
9 |
10 | public bool LSMode { get; set; }
11 |
12 | public bool RSMode { get; set; }
13 |
14 | public double LSRoundness { get; set; } = DefaultSquareStickRoundness;
15 |
16 | public double RSRoundness { get; set; } = DefaultSquareStickRoundness;
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/StickAntiSnapbackInfo.cs:
--------------------------------------------------------------------------------
1 | using PropertyChanged;
2 |
3 | namespace Vapour.Shared.Common.Types;
4 |
5 | [AddINotifyPropertyChangedInterface]
6 | public class StickAntiSnapbackInfo
7 | {
8 | public const double DefaultDelta = 135;
9 | public const int DefaultTimeout = 50;
10 | public const bool DefaultEnabled = false;
11 |
12 | public bool Enabled { get; set; } = DefaultEnabled;
13 |
14 | public double Delta { get; set; } = DefaultDelta;
15 |
16 | public int Timeout { get; set; } = DefaultTimeout;
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/StickControlSettings.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class StickControlSettings
4 | {
5 | public void Reset()
6 | {
7 | }
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/StickModeSettings.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public class StickModeSettings
4 | {
5 | public FlickStickSettings FlickSettings { get; set; } = new();
6 |
7 | public StickControlSettings ControlSettings { get; set; } = new();
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/StickOutputSetting.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum StickMode : uint
4 | {
5 | None,
6 | Controls,
7 | FlickStick
8 | }
9 |
10 | public class StickOutputSetting
11 | {
12 | public StickMode Mode { get; set; } = StickMode.Controls;
13 |
14 | public StickModeSettings OutputSettings { get; set; } = new();
15 |
16 | public void ResetSettings()
17 | {
18 | Mode = StickMode.Controls;
19 | OutputSettings.ControlSettings.Reset();
20 | OutputSettings.FlickSettings.Reset();
21 | }
22 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/TouchPadRelMouseSettings.cs:
--------------------------------------------------------------------------------
1 | using PropertyChanged;
2 |
3 | namespace Vapour.Shared.Common.Types;
4 |
5 | [AddINotifyPropertyChangedInterface]
6 | public class TouchPadRelMouseSettings
7 | {
8 | public const double DefaultAngDegree = 0.0;
9 | public const double DefaultAngRad = DefaultAngDegree * Math.PI / 180.0;
10 | public const double DefaultMinThreshold = 1.0;
11 |
12 | public double Rotation { get; set; } = DefaultAngRad;
13 |
14 | public double MinThreshold { get; set; } = DefaultMinThreshold;
15 |
16 | public void Reset()
17 | {
18 | Rotation = DefaultAngRad;
19 | MinThreshold = DefaultMinThreshold;
20 | }
21 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/TouchpadAbsMouseSettings.cs:
--------------------------------------------------------------------------------
1 | using System.Xml.Serialization;
2 |
3 | using PropertyChanged;
4 |
5 | namespace Vapour.Shared.Common.Types;
6 |
7 | [AddINotifyPropertyChangedInterface]
8 | [XmlRoot(ElementName = "TouchpadAbsMouseSettings")]
9 | public class TouchpadAbsMouseSettings
10 | {
11 | public const int DefaultMaxZoneX = 90;
12 | public const int DefaultMaxZoneY = 90;
13 | public const bool DefaultSnapCenter = false;
14 |
15 | [XmlElement(ElementName = "MaxZoneX")] public int MaxZoneX { get; set; }
16 |
17 | [XmlElement(ElementName = "MaxZoneY")] public int MaxZoneY { get; set; }
18 |
19 | [XmlElement(ElementName = "SnapToCenter")]
20 | public bool SnapToCenter { get; set; }
21 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/TouchpadOutMode.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum TouchpadOutMode : uint
4 | {
5 | None,
6 | Mouse,
7 | Controls,
8 | AbsoluteMouse,
9 | Passthru
10 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/TrayIconChoice.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum TrayIconChoice : uint
4 | {
5 | Default,
6 | Colored,
7 | White,
8 | Black
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Types/TriggerEffects.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Types;
2 |
3 | public enum TriggerEffects : ushort
4 | {
5 | None,
6 | Rigid,
7 | Pulse,
8 | FullClick
9 | }
10 |
11 | public enum TriggerId : ushort
12 | {
13 | Trigger0,
14 | LeftTrigger = Trigger0,
15 | Trigger1,
16 | RightTrigger = Trigger1
17 | }
18 |
19 | public class TriggerEffectSettings
20 | {
21 | public byte MaxValue { get; set; }
22 |
23 | public byte StartValue { get; set; }
24 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Interfaces/Vapour.Shared.Common.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 | Vapour.Shared.Common
6 | True
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Utils/CloningExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 |
3 | using FastDeepCloner;
4 |
5 | namespace Vapour.Shared.Common.Util;
6 |
7 | [SuppressMessage("ReSharper", "UnusedMember.Global")]
8 | public static class CloningExtensions
9 | {
10 | ///
11 | /// Performs deep (full) copy of object and related graph
12 | ///
13 | public static T DeepClone(this T obj)
14 | {
15 | return (T)obj.Clone();
16 | }
17 |
18 | ///
19 | /// Performs deep (full) copy of object and related graph to existing object
20 | ///
21 | /// existing filled object
22 | /// Method is valid only for classes, classes should be descendants in reality, not in declaration
23 | public static TTo DeepCloneTo(this TFrom objFrom, TTo objTo) where TTo : class, TFrom
24 | {
25 | objFrom.CloneTo(objTo);
26 |
27 | return objTo;
28 | }
29 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Utils/ColorExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 | using System.Drawing;
3 |
4 | namespace Vapour.Shared.Common.Util;
5 |
6 | [SuppressMessage("ReSharper", "UnusedMember.Global")]
7 | public static class ColorConverterExtensions
8 | {
9 | public static string ToHexString(this Color c)
10 | {
11 | return $"#{c.R:X2}{c.G:X2}{c.B:X2}";
12 | }
13 |
14 | public static string ToRgbString(this Color c)
15 | {
16 | return $"RGB({c.R}, {c.G}, {c.B})";
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Utils/MathsUtils.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Common.Util;
2 |
3 | public static class MathsUtils
4 | {
5 | public static double Clamp(double min, double value, double max)
6 | {
7 | return value < min ? min : value > max ? max : value;
8 | }
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common.Utils/Vapour.Shared.Common.Util.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | True
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common/CommonRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 | using Vapour.Shared.Common.Services;
6 |
7 | namespace Vapour.Shared.Common;
8 |
9 | ///
10 | /// Registers common state and utility services.
11 | ///
12 | public class CommonRegistrar : IServiceRegistrar
13 | {
14 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
15 | {
16 | services.AddSingleton();
17 | services.AddSingleton();
18 | }
19 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common/README.md:
--------------------------------------------------------------------------------
1 | # DS4Windows.Shared.Common
2 |
3 | Hosts the most basic types and utilities shared by all other assemblies of the solution.
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Common/Util/ByteArrayUtils.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.InteropServices;
2 |
3 | namespace Vapour.Shared.Common.Util;
4 |
5 | public static class ByteArrayUtils
6 | {
7 | public static T ByteArrayToStructure(this byte[] bytes) where T : struct
8 | {
9 | T stuff;
10 | var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
11 | try
12 | {
13 | stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
14 | }
15 | finally
16 | {
17 | handle.Free();
18 | }
19 |
20 | return stuff;
21 | }
22 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Common/Util/PhysicalAddressExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Net.NetworkInformation;
2 |
3 | namespace Vapour.Shared.Common.Util;
4 |
5 | public static class PhysicalAddressExtensions
6 | {
7 | ///
8 | /// Converts a to a human readable hex string.
9 | ///
10 | /// The object to transform.
11 | /// The hex string.
12 | public static string ToFriendlyName(this PhysicalAddress address)
13 | {
14 | if (address == null)
15 | return string.Empty;
16 |
17 | if (address.Equals(PhysicalAddress.None))
18 | return "00:00:00:00:00:00";
19 |
20 | var bytes = address.GetAddressBytes();
21 |
22 | return $"{bytes[0]:X2}:{bytes[1]:X2}:{bytes[2]:X2}:{bytes[3]:X2}:{bytes[4]:X2}:{bytes[5]:X2}";
23 | }
24 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles.Interfaces/Constants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Configuration.Profiles;
2 |
3 | public static class Constants
4 | {
5 | ///
6 | /// The identifying the default (always available) profile that is always ensured to exist.
7 | ///
8 | public static readonly Guid DefaultProfileId = Guid.Parse("C74D58EA-058F-4D01-BF08-8D765CC145D1");
9 | }
10 |
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles.Interfaces/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles.Interfaces/Schema/ProfileChangedEventArgs.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Configuration.Profiles.Schema;
2 | public class ProfileChangedEventArgs : EventArgs
3 | {
4 | public ProfileChangedEventArgs(string inputSourceKey, IProfile oldProfile, IProfile newProfile)
5 | {
6 | InputSourceKey = inputSourceKey;
7 | OldProfile = oldProfile;
8 | NewProfile = newProfile;
9 | }
10 |
11 | public string InputSourceKey { get; }
12 | public IProfile OldProfile { get; }
13 | public IProfile NewProfile { get; }
14 | }
15 |
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles.Interfaces/Vapour.Shared.Configuration.Profiles.Interfaces.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | true
6 | Vapour.Shared.Configuration.Profiles
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles/ProfilesRegistrar.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Hosting;
3 |
4 | using Vapour.Client.Core.DependencyInjection;
5 | using Vapour.Shared.Configuration.Profiles.Services;
6 |
7 | namespace Vapour.Shared.Configuration.Profiles;
8 |
9 | ///
10 | /// Registers services handling profiles.
11 | ///
12 | public class ProfilesRegistrar : IServiceRegistrar
13 | {
14 | public void ConfigureServices(IHostBuilder builder, HostBuilderContext context, IServiceCollection services)
15 | {
16 | services.AddSingleton();
17 | }
18 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Configuration.Profiles/README.md:
--------------------------------------------------------------------------------
1 | # DS4Windows.Shared.Configuration.Profiles
2 |
3 | Hosts all types related to persisted profiles.
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/DeviceSettings.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices;
2 |
3 | public class DeviceSettings
4 | {
5 | public bool? IsFilteringEnabled { get; set; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/ConnectionType.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | public enum ConnectionType : byte
4 | {
5 | Unknown,
6 | Bluetooth,
7 | SonyWirelessAdapter,
8 | Usb
9 | } // Prioritize Bluetooth when both BT and USB are connected.
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/DualSenseDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.Services.ControllerEnumerators;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | public sealed class DualSenseDeviceInfo : DeviceInfo
6 | {
7 | public override int VendorId => 0x054C;
8 |
9 | public override int ProductId => 0x0CE6;
10 |
11 | public override string Name => "DualSense";
12 |
13 | public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } = new()
14 | {
15 | InterruptInEndpointAddress = 0x84, InterruptOutEndpointAddress = 0x03
16 | };
17 |
18 | public override bool IsBtFilterable => false;
19 | }
20 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/DualShock4StrikePackDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 | using Vapour.Shared.Devices.Services.ControllerEnumerators;
3 |
4 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
5 |
6 | public sealed class DualShock4StrikePackDeviceInfo : DualShock4DeviceInfo
7 | {
8 | public override int VendorId => 0x054C;
9 |
10 | public override int ProductId => 0x05C5;
11 |
12 | public override string Name => "DualShock 4 Strike Pack Eliminator";
13 |
14 | public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
15 | new() { InterruptInEndpointAddress = 0x81, InterruptOutEndpointAddress = 0x03 };
16 | }
17 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/DualShock4UsbWirelessAdapterDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 | using Vapour.Shared.Devices.Services.ControllerEnumerators;
3 |
4 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
5 |
6 | public sealed class DualShock4UsbWirelessAdapterDeviceInfo : DualShock4DeviceInfo
7 | {
8 | public override int VendorId => 0x054C;
9 |
10 | public override int ProductId => 0x0BA0;
11 |
12 | public override string Name => "Sony Wireless Adapter";
13 |
14 | public override bool IsDongle => true;
15 |
16 | public override CompatibleHidDeviceFeatureSet FeatureSet => CompatibleHidDeviceFeatureSet.MonitorAudio;
17 |
18 | public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
19 | new() { InterruptInEndpointAddress = 0x84, InterruptOutEndpointAddress = 0x03 };
20 | }
21 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/DualShock4V1DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 | using Vapour.Shared.Devices.Services.ControllerEnumerators;
3 |
4 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
5 |
6 | public sealed class DualShock4V1DeviceInfo : DualShock4DeviceInfo
7 | {
8 | public override int VendorId => 0x054C;
9 |
10 | public override int ProductId => 0x05C4;
11 |
12 | public override string Name => "DualShock 4 v1";
13 |
14 | public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
15 | new() { InterruptInEndpointAddress = 0x84, InterruptOutEndpointAddress = 0x03 };
16 | }
17 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/DualShock4V2DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 | using Vapour.Shared.Devices.Services.ControllerEnumerators;
3 |
4 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
5 |
6 | public sealed class DualShock4V2DeviceInfo : DualShock4DeviceInfo
7 | {
8 | public override int VendorId => 0x054C;
9 |
10 | public override int ProductId => 0x09CC;
11 |
12 | public override string Name => "DualShock 4 v2";
13 |
14 | public override CompatibleHidDeviceFeatureSet FeatureSet { get; } = CompatibleHidDeviceFeatureSet.MonitorAudio |
15 | CompatibleHidDeviceFeatureSet
16 | .VendorDefinedDevice;
17 |
18 | public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
19 | new() { InterruptInEndpointAddress = 0x84, InterruptOutEndpointAddress = 0x03 };
20 |
21 | public override bool IsBtFilterable => false;
22 | }
23 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/JoyConLeftDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | public sealed class JoyConLeftDeviceInfo : JoyConDeviceInfo
6 | {
7 | public override int VendorId => 0x57e;
8 |
9 | public override int ProductId => 0x2006;
10 |
11 | public override string Name => "JoyCon (L)";
12 |
13 | public override bool IsLeftDevice => true;
14 | }
15 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/JoyConRightDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | public sealed class JoyConRightDeviceInfo : JoyConDeviceInfo
6 | {
7 | public override int VendorId => 0x57e;
8 |
9 | public override int ProductId => 0x2007;
10 |
11 | public override string Name => "JoyCon (R)";
12 |
13 | public override bool IsRightDevice => true;
14 | }
15 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/Meta/DualShock4DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | ///
4 | /// Sony DualShock 4 compatible devices.
5 | ///
6 | public abstract class DualShock4DeviceInfo : DeviceInfo
7 | {
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/Meta/JoyConDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | ///
4 | /// JoyCons-compatible devices.
5 | ///
6 | public abstract class JoyConDeviceInfo : DeviceInfo
7 | {
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/Meta/XboxCompositeDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | ///
4 | /// Devices compatible with the "XboxComposite" device class. Contains XGIP and XUSB-compatible devices.
5 | ///
6 | public abstract class XboxCompositeDeviceInfo : DeviceInfo
7 | {
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/README.md:
--------------------------------------------------------------------------------
1 | # About `DeviceInfo` classes
2 |
3 | These classes hold the identification properties of all compatible input devices.
4 |
5 | To be continued...
6 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/SteamDeckDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
2 |
3 | public sealed class SteamDeckDeviceInfo : DeviceInfo
4 | {
5 | public override int VendorId => 0x28DE;
6 |
7 | public override int ProductId => 0x1205;
8 |
9 | public override string Name => "Steam Deck";
10 |
11 | public override CompatibleHidDeviceFeatureSet FeatureSet => CompatibleHidDeviceFeatureSet.VendorDefinedDevice;
12 | }
13 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/SwitchProDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
2 |
3 | public sealed class SwitchProDeviceInfo : DeviceInfo
4 | {
5 | public override int VendorId => 0x57e;
6 |
7 | public override int ProductId => 0x2009;
8 |
9 | public override string Name => "Switch Pro";
10 |
11 | public override CompatibleHidDeviceFeatureSet FeatureSet => CompatibleHidDeviceFeatureSet.VendorDefinedDevice;
12 | }
13 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/XboxEliteSeries1DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | ///
6 | /// Xbox One Elite Controller
7 | ///
8 | /// TODO: causes crash, investigate!
9 | public sealed class XboxEliteSeries1DeviceInfo : XboxCompositeDeviceInfo
10 | {
11 | public override int VendorId => 0x045E;
12 |
13 | public override int ProductId => 0x02E3;
14 |
15 | public override string Name => "Xbox Elite Series 1";
16 |
17 | //public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
18 | // new() { InterruptInEndpointAddress = 0x83, InterruptOutEndpointAddress = 0x03 };
19 | }
20 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/XboxEliteSeries2DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | ///
6 | /// Xbox Elite Series 2 Controller (model 1797)
7 | ///
8 | public sealed class XboxEliteSeries2DeviceInfo : XboxCompositeDeviceInfo
9 | {
10 | public override int VendorId => 0x045E;
11 |
12 | public override int ProductId => 0x0B00;
13 |
14 | public override string Name => "Xbox Elite Series 2";
15 |
16 | //public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
17 | // new() { InterruptInEndpointAddress = 0x83, InterruptOutEndpointAddress = 0x03 };
18 | }
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/XboxOneSDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | ///
6 | /// Xbox One S Controller [Bluetooth]
7 | ///
8 | public sealed class XboxOneSDeviceInfo : XboxCompositeDeviceInfo
9 | {
10 | public override int VendorId => 0x045E;
11 |
12 | public override int ProductId => 0x02FF;
13 |
14 | public override string Name => "Xbox One S";
15 |
16 | //public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
17 | // new() { InterruptInEndpointAddress = 0x83, InterruptOutEndpointAddress = 0x03 };
18 | }
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/XboxWireless2DeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | ///
6 | /// Xbox Wireless Controller (model ?)
7 | ///
8 | public sealed class XboxWireless2DeviceInfo : XboxCompositeDeviceInfo
9 | {
10 | public override int VendorId => 0x045E;
11 |
12 | public override int ProductId => 0x0B13;
13 |
14 | public override string Name => "Xbox Wireless Controller";
15 |
16 | //public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
17 | // new() { InterruptInEndpointAddress = 0x83, InterruptOutEndpointAddress = 0x03 };
18 | }
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceInfos/XboxWirelessDeviceInfo.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos.Meta;
2 |
3 | namespace Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | ///
6 | /// Xbox Wireless Controller (model 1914)
7 | ///
8 | public sealed class XboxWirelessDeviceInfo : XboxCompositeDeviceInfo
9 | {
10 | public override int VendorId => 0x045E;
11 |
12 | public override int ProductId => 0x0B12;
13 |
14 | public override string Name => "Xbox Wireless Controller";
15 |
16 | //public override HidDeviceOverWinUsbEndpoints WinUsbEndpoints { get; } =
17 | // new() { InterruptInEndpointAddress = 0x83, InterruptOutEndpointAddress = 0x03 };
18 | }
19 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/DeviceNotificationListenerSubscriber.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | public interface IDeviceNotificationListenerSubscriber
4 | {
5 | event Action DeviceArrived;
6 | event Action DeviceRemoved;
7 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/IDeviceFactory.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID.DeviceInfos;
2 |
3 | namespace Vapour.Shared.Devices.HID;
4 |
5 | public interface IDeviceFactory
6 | {
7 | DeviceInfo IsKnownDevice(int vid, int pid);
8 |
9 | ICompatibleHidDevice CreateDevice(DeviceInfo deviceInfo, IHidDevice hidDevice);
10 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/IRawInputSourceReport.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | public interface IRawInputSourceReport : IInputSourceReport
4 | {
5 | public void Parse(ReadOnlySpan input);
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/IStructInputSourceReport.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | public interface IStructInputSourceReport : IInputSourceReport
4 | where T : struct
5 | {
6 | void Parse(ref T input);
7 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputDeviceService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | ///
4 | /// Describes possible driver services (primary driver) a device can operate under.
5 | ///
6 | public enum InputDeviceService
7 | {
8 | ///
9 | /// The default service for HIDCLASS.SYS devices over USB.
10 | ///
11 | HidUsb,
12 | ///
13 | /// The default service for HIDCLASS.SYS devices over Bluetooth.
14 | ///
15 | HidBth,
16 | ///
17 | /// WinUSB service.
18 | ///
19 | WinUsb
20 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/JoyCon/In/Enums.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.JoyCon.In;
2 |
3 | [Flags]
4 | public enum JoyConButtonsLeft : byte
5 | {
6 | DpadDown = 0x01,
7 | DpadUp = 0x02,
8 | DpadRight = 0x04,
9 | DpadLeft = 0x08,
10 | SR = 0x10,
11 | SL = 0x20,
12 | L1 = 0x40,
13 | L2 = 0x80,
14 | }
15 |
16 | [Flags]
17 | public enum JoyConButtonsRight : byte
18 | {
19 | Y = 0x01,
20 | X = 0x02,
21 | B = 0x04,
22 | A = 0x08,
23 | SR = 0x10,
24 | SL = 0x20,
25 | R1 = 0x40,
26 | R2 = 0x80,
27 | }
28 |
29 | [Flags]
30 | public enum JoyConButtonsShared : byte
31 | {
32 | Minus = 0x01,
33 | Plus = 0x02,
34 | RStick = 0x04,
35 | LStick = 0x08,
36 | Home = 0x10,
37 | Capture = 0x20,
38 | ChargingGrip = 0x80,
39 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/JoyCon/In/InConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.JoyCon.In;
2 |
3 | public static class InConstants
4 | {
5 | public const byte SubCommandReportId = 0x21;
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/JoyCon/Out/Structs.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.InteropServices;
2 |
3 | using Vapour.Shared.Common.Util;
4 |
5 | namespace Vapour.Shared.Devices.HID.InputTypes.JoyCon.Out;
6 |
7 | [StructLayout(LayoutKind.Sequential, Pack = 1)]
8 | public struct SubCommand
9 | {
10 | public SubCommand()
11 | {
12 |
13 | }
14 |
15 | public byte ReportId;
16 | public byte CommandCount;
17 | public StructArray8 RumbleData = new (OutConstants.DefaultRumbleData);
18 | public byte SubCommandId;
19 | public StructArray5 Data = new();
20 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/SteamDeck/Feature/FeatureConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.SteamDeck.Feature;
2 | public static class FeatureConstants
3 | {
4 | public const byte SerialFeatureId = 0x15;
5 | }
6 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/SteamDeck/In/Enums.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.SteamDeck.In;
2 |
3 | [Flags]
4 | public enum SteamDeckButtons0 : ushort
5 | {
6 | L5 = 0b1000000000000000,
7 | Options = 0b0100000000000000,
8 | Steam = 0b0010000000000000,
9 | Menu = 0b0001000000000000,
10 | DpadDown = 0b0000100000000000,
11 | DpadLeft = 0b0000010000000000,
12 | DpadRight = 0b0000001000000000,
13 | DpadUp = 0b0000000100000000,
14 | A = 0b0000000010000000,
15 | X = 0b0000000001000000,
16 | B = 0b0000000000100000,
17 | Y = 0b0000000000010000,
18 | L1 = 0b0000000000001000,
19 | R1 = 0b0000000000000100,
20 | L2 = 0b0000000000000010,
21 | R2 = 0b0000000000000001,
22 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/SteamDeck/In/InConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.SteamDeck.In;
2 |
3 | public static class InConstants
4 | {
5 | public const byte ReportId = 1;
6 | public const byte ButtonsOffset = 0;
7 | public const byte SticksAndTriggersOffset = 36;
8 | public const byte LeftStickPress = 0x40;
9 | public const byte RightStickPress = 0x04;
10 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/CommonConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox;
2 | public static class CommonConstants
3 | {
4 | public const uint IoctlXinputBase = 0x8000;
5 | }
6 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/Feature/FeatureConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox.Feature;
2 | public static class FeatureConstants
3 | {
4 | public const byte SerialFeatureId = 0x03;
5 | }
6 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/In/Enums.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox.In;
2 |
3 | [Flags]
4 | public enum XboxButtons : UInt16
5 | {
6 | Start = 0x0010,
7 | Xbox = 0x0400,
8 | Back = 0x0020,
9 | DpadDown = 0x0002,
10 | DpadLeft = 0x0004,
11 | DpadRight = 0x0008,
12 | DpadUp = 0x0001,
13 | A = 0x1000,
14 | X = 0x4000,
15 | B = 0x2000,
16 | Y = 0x8000,
17 | L1 = 0x0100,
18 | R1 = 0x0200,
19 | L3 = 0x0040,
20 | R3 = 0x0080,
21 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/In/InConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox.In;
2 |
3 | public static class InConstants
4 | {
5 | public const int InputReportLength = 29;
6 | public const uint GetState = 0x803;
7 | public static readonly byte[] GetReportCode = { 0x01, 0x01, 0x00 };
8 | public const byte InputReportDataOffset = 11;
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/In/Structs.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.InteropServices;
2 |
3 | using Vapour.Shared.Common.Util;
4 |
5 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox.In;
6 |
7 | [StructLayout(LayoutKind.Sequential, Pack = 1)]
8 | public struct InputReport
9 | {
10 | public StructArray11 Packet;
11 | public InputReportData InputReportData;
12 | }
13 |
14 | [StructLayout(LayoutKind.Sequential, Pack = 1)]
15 | public struct InputReportData
16 | {
17 | public XboxButtons Buttons;
18 | public byte LeftTrigger;
19 | public byte RightTrigger;
20 | public short LeftThumbX;
21 | public short LeftThumbY;
22 | public short RightThumbX;
23 | public short RightThumbY;
24 | }
25 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/HID/InputTypes/Xbox/Out/OutConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID.InputTypes.Xbox.Out;
2 |
3 | public static class OutConstants
4 | {
5 | public const uint SetState = 0x804;
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/NativeMethods.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://aka.ms/CsWin32.schema.json",
3 | "emitSingleFile": true,
4 | "public": true
5 | }
6 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/NativeMethods.txt:
--------------------------------------------------------------------------------
1 | HIDD_ATTRIBUTES
2 | HIDP_CAPS
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/GameInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 | public class GameInfo
3 | {
4 | public string GameId { get; set; }
5 | public string GameName { get; set; }
6 | public GameSource GameSource { get; set; }
7 | }
8 |
9 | public enum GameSource
10 | {
11 | Steam,
12 | UWP,
13 | Blizzard,
14 | Epic,
15 | EA,
16 | Folder
17 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/IDeviceSettingsService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 |
3 | public interface IDeviceSettingsService
4 | {
5 | void LoadSettings();
6 | void SaveSettings();
7 | DeviceSettings Settings { get; }
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/IGameListProviderService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 |
3 | public interface IGameListProviderService
4 | {
5 | List GetGameSelectionList(string inputSourceKey, GameSource gameSource, Dictionary> inputSourceGameConfigurations);
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/IGameProcessWatcherService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 |
3 | public interface IGameProcessWatcherService
4 | {
5 | void StartWatching();
6 | void StopWatching();
7 | event Action GameWatchStarted;
8 | event Action GameWatchStopped;
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/IInputSourceConfigurationService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 |
3 | public interface IInputSourceConfigurationService
4 | {
5 | void Initialize();
6 |
7 | void AddOrUpdateInputSourceGameConfiguration(string inputSourceKey,
8 | GameInfo gameInfo,
9 | InputSourceConfiguration inputSourceConfiguration);
10 | List GetGameSelectionList(string inputSourceKey, GameSource gameSource);
11 | void DeleteGameConfiguration(string inputSourceKey, string gameId);
12 | Func GetCurrentGameRunning { get; set; }
13 | InputSourceConfiguration GetMultiControllerConfiguration(string deviceKey);
14 | List GetInputSourceConfigurations(string inputSourceKey);
15 | void UpdateInputSourceConfiguration(string inputSourceKey, InputSourceConfiguration configuration);
16 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/InputSourceConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 |
3 | using Vapour.Shared.Common.Types;
4 | using Vapour.Shared.Configuration.Profiles.Schema;
5 |
6 | namespace Vapour.Shared.Devices.Services.Configuration;
7 |
8 | public class InputSourceConfiguration
9 | {
10 | public List Controllers { get; set; } = new();
11 | [JsonInclude]
12 | public Guid ProfileId { get; set; }
13 |
14 | public OutputDeviceType OutputDeviceType { get; set; }
15 | public string CustomLightbar { get; set; }
16 | public string LoadedLightbar { get; set; }
17 | public bool IsRumbleEnabled { get; set; }
18 | public bool IsPassthru { get; set; }
19 |
20 | [JsonIgnore]
21 | public IProfile Profile { get; set; }
22 |
23 | public bool IsGameConfiguration => GameInfo != null;
24 | public GameInfo GameInfo { get; set; }
25 |
26 | [JsonIgnore]
27 | public int PlayerNumber { get; set; }
28 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/InputSourceConfigurationChangedEventArgs.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 |
3 | public class InputSourceConfigurationChangedEventArgs : EventArgs
4 | {
5 | public string InputSourceKey { get; set; }
6 |
7 | public InputSourceConfiguration InputSourceConfiguration { get; set; }
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/InputSourceConfigurationController.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 | public class InputSourceConfigurationController
3 | {
4 | public string DeviceKey { get; set; }
5 |
6 | public MultiControllerConfigurationType MultiControllerConfigurationType { get; set; } =
7 | MultiControllerConfigurationType.None;
8 | public int Index { get; set; }
9 | }
10 |
11 | public enum MultiControllerConfigurationType
12 | {
13 | Left,
14 | Right,
15 | None,
16 | Custom
17 | }
18 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/Messages/GameWatchMessage.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration.Messages;
2 | public class GameWatchMessage
3 | {
4 | public bool IsStarted { get; set; }
5 | public ProcessorWatchItem WatchItem { get; set; }
6 | }
7 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/Messages/MessageKeys.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration.Messages;
2 | public static class MessageKeys
3 | {
4 | public const string InputSourceReadyKey = "InputSourceReady";
5 | public const string FilterDriverEnabledChangedKey = "FilterDriverEnableChanged";
6 | public const string ConfigurationChangedKey = "ConfigurationChanged";
7 | public const string OutputDeviceReportReceivedKey = "OutputDeviceReportReceived";
8 | public const string InputReportAvailableKey = "InputReportAvailable";
9 | }
10 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Configuration/ProcessorWatchItem.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Configuration;
2 | public class ProcessorWatchItem
3 | {
4 | public GameSource GameSource { get; set; }
5 |
6 | public string GameId { get; init; }
7 |
8 | public string ImagePath { get; init; }
9 |
10 | public int Count { get; set; }
11 | }
12 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/ControllerEnumerators/IHidDeviceEnumeratorService.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID;
2 |
3 | namespace Vapour.Shared.Devices.Services.ControllerEnumerators;
4 |
5 | ///
6 | /// Single point of truth of states for all connected and handled HID devices.
7 | ///
8 | public interface IHidDeviceEnumeratorService where TDevice : IHidDevice
9 | {
10 | ///
11 | /// Gets fired when a new HID device has been detected.
12 | ///
13 | event Action DeviceArrived;
14 |
15 | ///
16 | /// Gets fired when an existing HID device has been removed.
17 | ///
18 | event Action DeviceRemoved;
19 |
20 | ///
21 | /// This goes through the system and adds supported hid devices
22 | ///
23 | void Start();
24 |
25 | void Stop();
26 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/IInputSourceBuilderService.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID;
2 |
3 | namespace Vapour.Shared.Devices.Services;
4 |
5 | public interface IInputSourceBuilderService
6 | {
7 | bool ShouldAutoCombineJoyCons { get; set; }
8 | List BuildInputSourceList(List controllers);
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/IInputSourceDataSource.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services;
2 |
3 | public interface IInputSourceDataSource
4 | {
5 | List InputSources { get; }
6 | event Action InputSourceCreated;
7 | event Action InputSourceRemoved;
8 | IInputSource GetByInputSourceKey(string inputSourceKey);
9 | void FireCreated(IInputSource inputSource);
10 | void FireRemoved(IInputSource inputSource);
11 | IInputSource GetByDeviceInstanceId(string instanceId);
12 | IInputSource GetByDeviceParentInstanceId(string instanceId);
13 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/IInputSourceProcessor.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services;
2 |
3 | public interface IInputSourceProcessor : IDisposable
4 | {
5 | void Start(IInputSource inputSource);
6 |
7 | void Stop();
8 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/IInputSourceService.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services;
2 |
3 | public interface IInputSourceService
4 | {
5 | void Stop();
6 | Task Start(CancellationToken ct = default);
7 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/CustomActions/GracefulShutdownAction.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting.CustomActions;
2 |
3 | public class GracefulShutdownAction : ICustomAction
4 | {
5 | public IInputSource InputSource { get; set; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/CustomActions/ICustomAction.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting.CustomActions;
2 |
3 | public interface ICustomAction
4 | {
5 | public IInputSource InputSource { get; set; }
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/CustomActions/SetPlayerLedAndColorAction.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting.CustomActions;
2 | public class SetPlayerLedAndColorAction : ICustomAction
3 | {
4 | public IInputSource InputSource { get; set; }
5 | public byte PlayerNumber { get; set; }
6 | }
7 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/ICustomActionProcessor.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting;
2 |
3 | public interface ICustomActionProcessor
4 | {
5 | Task ProcessReport(IInputSource inputSource, InputSourceFinalReport inputReport);
6 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/IInputReportProcessor.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting;
2 |
3 | ///
4 | /// Handles reading input reports from a compatible input device and dispatches them.
5 | ///
6 | public interface IInputReportProcessor
7 | {
8 | IInputSource InputSource { get; }
9 |
10 | bool IsInputReportAvailableInvoked { get; set; }
11 |
12 | bool IsProcessing { get; }
13 |
14 | ///
15 | /// Start the input report reader.
16 | ///
17 | void StartInputReportReader();
18 |
19 | ///
20 | /// Stops the input report reader.
21 | ///
22 | void StopInputReportReader();
23 |
24 | void SetInputSource(IInputSource inputSource);
25 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/IOutDevice.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Common.Types;
2 |
3 | namespace Vapour.Shared.Devices.Services.Reporting;
4 |
5 | public interface IOutDevice
6 | {
7 | void ConvertAndSendReport(InputSourceFinalReport state, int device = 0);
8 | void Connect();
9 | void Disconnect();
10 | void ResetState(bool submit = true);
11 | OutputDeviceType GetDeviceType();
12 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/IOutputDeviceProcessor.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting;
2 |
3 | public interface IOutputDeviceProcessor
4 | {
5 | IInputSource InputSource { get; }
6 | void StartOutputProcessing();
7 | void StopOutputProcessing();
8 | void SetInputSource(IInputSource inputSource);
9 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/IOutputReportProcessor.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Devices.HID;
2 |
3 | namespace Vapour.Shared.Devices.Services.Reporting;
4 |
5 | public interface IOutputReportProcessor
6 | {
7 | bool IsProcessing { get; set; }
8 | void SetDevice(ICompatibleHidDevice device);
9 | void Start();
10 | void Stop();
11 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices.Interfaces/Services/Reporting/OutputDeviceReport.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.Services.Reporting;
2 | public class OutputDeviceReport
3 | {
4 | public IInputSource InputSource { get; set; }
5 |
6 | public byte[] FormattedData { get; } = new byte[3];
7 |
8 | public byte StrongMotor
9 | {
10 | get => FormattedData[0];
11 | set => FormattedData[0] = value;
12 | }
13 |
14 | public byte WeakMotor
15 | {
16 | get => FormattedData[1];
17 | set => FormattedData[1] = value;
18 | }
19 |
20 | public byte LedNumber
21 | {
22 | get => FormattedData[2];
23 | set => FormattedData[2] = value;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/HID/Devices/SwitchProCompatibleHidDevice.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Logging;
2 |
3 | using Vapour.Shared.Devices.HID.DeviceInfos;
4 |
5 | namespace Vapour.Shared.Devices.HID.Devices;
6 |
7 | public sealed class SwitchProCompatibleHidDevice : CompatibleHidDevice
8 | {
9 | public SwitchProCompatibleHidDevice(ILogger logger, List deviceInfos)
10 | : base(logger, deviceInfos)
11 | {
12 | }
13 |
14 | public override InputSourceReport InputSourceReport { get; }
15 |
16 | protected override Type InputDeviceType => typeof(SwitchProDeviceInfo);
17 |
18 | protected override void OnInitialize()
19 | {
20 | }
21 |
22 | public override void ProcessInputReport(ReadOnlySpan input)
23 | {
24 | throw new NotImplementedException();
25 | }
26 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/HID/HidDeviceOverBluetooth.cs:
--------------------------------------------------------------------------------
1 | namespace Vapour.Shared.Devices.HID;
2 |
3 | ///
4 | /// Describes a connected via Bluetooth.
5 | ///
6 | internal class HidDeviceOverBluetooth : HidDevice
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/NativeMethods.txt:
--------------------------------------------------------------------------------
1 | HidD_GetHidGuid
2 | HidD_SetOutputReport
3 | HidD_SetFeature
4 | HidD_GetFeature
5 | HidD_SetNumInputBuffers
6 | HidD_GetManufacturerString
7 | HidD_GetProductString
8 | HidD_GetSerialNumberString
9 | HidD_GetAttributes
10 | HidD_GetPreparsedData
11 | HidP_GetCaps
12 | HidD_FreePreparsedData
13 | HIDD_ATTRIBUTES
14 | HIDP_CAPS
15 | ReadFile
16 | WriteFile
17 | CreateFile
18 | DeviceIoControl
19 | GetOverlappedResult
20 | GetOverlappedResultEx
21 | WIN32_ERROR
22 | CM_Get_Device_ID
23 | GetVolumePathNamesForVolumeName
24 | FindFirstVolume
25 | FindNextVolume
26 | QueryDosDevice
27 | METHOD_BUFFERED
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/README.md:
--------------------------------------------------------------------------------
1 | # DS4Windows.Shared.Devices
2 |
3 | Hosts all types and utilities related to HID device enumeration and state handling.
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/Services/Reporting/OutDevice.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Common.Types;
2 |
3 | namespace Vapour.Shared.Devices.Services.Reporting;
4 |
5 | internal abstract class OutDevice : IOutDevice
6 | {
7 | protected bool IsConnected { get; set; }
8 |
9 | public abstract void ConvertAndSendReport(InputSourceFinalReport state, int device = 0);
10 |
11 | public abstract void Connect();
12 |
13 | public abstract void Disconnect();
14 |
15 | public abstract void ResetState(bool submit = true);
16 |
17 | public abstract OutputDeviceType GetDeviceType();
18 | }
--------------------------------------------------------------------------------
/Vapour.Shared.Devices/Util/IoControlCodes.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 |
3 | using Windows.Win32.Storage.FileSystem;
4 |
5 | namespace Vapour.Shared.Devices.Util;
6 |
7 | [SuppressMessage("ReSharper", "UnusedMember.Global")]
8 | internal static class IoControlCodes
9 | {
10 | ///
11 | /// Utility method to build an I/O Control Code.
12 | ///
13 | /// The device type value.
14 | /// The function value.
15 | /// The data passing method.
16 | /// The desired access.
17 | /// The built IOCTL code.
18 | internal static UInt32 CTL_CODE(uint deviceType, uint function, uint method, FILE_ACCESS_FLAGS access)
19 | {
20 | return (deviceType << 16) | ((uint)access << 14) | (function << 2) | method;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Vapour.Shared.Emulator.ViGEmGen1/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Vapour.Shared.Emulator.ViGEmGen1/Types/Legacy/OutputDevice.cs:
--------------------------------------------------------------------------------
1 | using Vapour.Shared.Common.Legacy;
2 |
3 | namespace Vapour.Shared.Emulator.ViGEmGen1.Types.Legacy;
4 |
5 | public abstract class OutputDevice
6 | {
7 | protected bool IsConnected;
8 |
9 | public abstract void ConvertAndSendReport(DS4State state, int device);
10 |
11 | public abstract void Connect();
12 |
13 | public abstract void Disconnect();
14 |
15 | public abstract void ResetState(bool submit = true);
16 |
17 | public abstract string GetDeviceType();
18 |
19 | public abstract void RemoveFeedbacks();
20 |
21 | public abstract void RemoveFeedback(int inIdx);
22 | }
--------------------------------------------------------------------------------
/assets/AiLogoColorRightText.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/assets/AiLogoColorRightText.png
--------------------------------------------------------------------------------
/assets/DS4Windows-128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/assets/DS4Windows-128x128.png
--------------------------------------------------------------------------------
/assets/Vapour-128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/assets/Vapour-128x128.png
--------------------------------------------------------------------------------
/assets/counters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/assets/counters.png
--------------------------------------------------------------------------------
/assets/setup_Z38OdfI0YX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CircumSpector/DS4Windows/62e4e59097156d75dda7a0def9120454809021b9/assets/setup_Z38OdfI0YX.png
--------------------------------------------------------------------------------
/doc/DS5-NOTES.md:
--------------------------------------------------------------------------------
1 | 204D6179203139203230323030323A30343A33330200040013030000BC000100410A00000000000000000000280100002A000100270000000600000000000000
2 |
3 | 204D6179203139203230323030323A30343A33330200040013030000BC000100410A00000000000000000000280100002A000100270000000600000000000000
4 |
5 | var feature = new byte[64];
6 | feature[0] = 32;
7 |
8 | hDevice.ReadFeatureData(feature);
9 |
10 | var hex = BitConverter.ToString(feature).Replace("-", "");
--------------------------------------------------------------------------------
/nuget.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------