├── .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 | --------------------------------------------------------------------------------