diff --git a/.gitignore b/.gitignore index 1bc915c5cb..2bdc199561 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,73 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.suo *.user +*.userosscache *.sln.docstates -# Build results +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs +# Build results [Dd]ebug/ +[Dd]ebugPublic/ [Rr]elease/ +[Rr]eleases/ x64/ -build/ +x86/ +bld/ [Bb]in/ [Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ -# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets -!packages/*/build/ +# Visual Studio 2017 auto generated files +Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio *_i.c *_p.c +*_i.h *.ilk *.meta *.obj +*.iobj *.pch *.pdb +*.ipdb *.pgc *.pgd *.rsp @@ -43,21 +82,34 @@ build/ *.vssscc .builds *.pidb -*.log +*.svclog *.scc +# Chutzpah Test files +_Chutzpah* + # Visual C++ cache files ipch/ *.aps *.ncb +*.opendb *.opensdf *.sdf *.cachefile +*.VC.db +*.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ # Guidance Automation Toolkit *.gpState @@ -65,6 +117,10 @@ ipch/ # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode # TeamCity is a build add-in _TeamCity* @@ -72,9 +128,25 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + # NCrunch -*.ncrunch* +_NCrunch_* .*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ # Installshield output folder [Ee]xpress/ @@ -93,64 +165,170 @@ DocProject/Help/html publish/ # Publish Web Output -*.Publish.xml +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets -# Windows Azure Build Output -csx +# Microsoft Azure Build Output +csx/ *.build.csdef -# Windows Store app package directory +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ # Others -sql/ -*.Cache ClientBin/ -[Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.[Pp]ublish.xml +*.dbproj.schemaview +*.jfm *.pfx *.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ # RIA/Silverlight projects Generated_Code/ -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak # SQL Server files -App_Data/*.mdf -App_Data/*.ldf +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs +# OpenCover UI analysis results +OpenCover/ -#LightSwitch generated files -GeneratedArtifacts/ -_Pvt_Extensions/ -ModelManifest.xml +# Azure Stream Analytics local run output +ASALocalRun/ -# ========================= -# Windows detritus -# ========================= +# MSBuild Binary and Structured Log +*.binlog -# Windows image file caches -Thumbs.db -ehthumbs.db +# NVidia Nsight GPU debugger configuration file +*.nvuser -# Folder config file -Desktop.ini +# MFractors (Xamarin productivity tool) working folder +.mfractor/ -# Recycle Bin used on file shares -$RECYCLE.BIN/ +!DS4WinWPF/libs/x64/ +!DS4WinWPF/libs/x86/ -# Mac desktop service store files -.DS_Store diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config deleted file mode 100644 index c2abfb4801..0000000000 --- a/.vs/config/applicationhost.config +++ /dev/null @@ -1,1030 +0,0 @@ - - - - - - - - -
-
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DS4Windows.sln b/DS4Windows.sln deleted file mode 100644 index 916f340568..0000000000 --- a/DS4Windows.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DS4Windows", "DS4Windows\DS4Windows.csproj", "{7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|x64.ActiveCfg = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|x64.Build.0 = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|Any CPU.Build.0 = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|x64.ActiveCfg = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|x64.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/DS4Windows/App.xaml b/DS4Windows/App.xaml new file mode 100644 index 0000000000..fd36568217 --- /dev/null +++ b/DS4Windows/App.xaml @@ -0,0 +1,25 @@ + + + + + + diff --git a/DS4Windows/App.xaml.cs b/DS4Windows/App.xaml.cs new file mode 100644 index 0000000000..dd75997041 --- /dev/null +++ b/DS4Windows/App.xaml.cs @@ -0,0 +1,510 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.MemoryMappedFiles; +using System.Linq; +using System.Net.Http; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Interop; +using WPFLocalizeExtension.Engine; +using NLog; +using System.Windows.Media; + +namespace DS4WinWPF +{ + /// + /// Interaction logic for App.xaml + /// + [System.Security.SuppressUnmanagedCodeSecurity] + public partial class App : Application + { + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + + [DllImport("user32.dll", EntryPoint = "FindWindow")] + private static extern IntPtr FindWindow(string sClass, string sWindow); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam); + + [StructLayout(LayoutKind.Sequential)] + public struct COPYDATASTRUCT + { + public IntPtr dwData; + public int cbData; + public IntPtr lpData; + } + + private Thread controlThread; + public static DS4Windows.ControlService rootHub; + public static HttpClient requestClient; + private bool skipSave; + private bool runShutdown; + private bool exitApp; + private Thread testThread; + private bool exitComThread = false; + private const string SingleAppComEventName = "{a52b5b20-d9ee-4f32-8518-307fa14aa0c6}"; + private EventWaitHandle threadComEvent = null; + private Timer collectTimer; + private static LoggerHolder logHolder; + + private MemoryMappedFile ipcClassNameMMF = null; // MemoryMappedFile for inter-process communication used to hold className of DS4Form window + private MemoryMappedViewAccessor ipcClassNameMMA = null; + + private void Application_Startup(object sender, StartupEventArgs e) + { + runShutdown = true; + skipSave = true; + + ArgumentParser parser = new ArgumentParser(); + parser.Parse(e.Args); + CheckOptions(parser); + + if (exitApp) + { + return; + } + + try + { + Process.GetCurrentProcess().PriorityClass = + ProcessPriorityClass.High; + } + catch { } // Ignore problems raising the priority. + + // Force Normal IO Priority + IntPtr ioPrio = new IntPtr(2); + DS4Windows.Util.NtSetInformationProcess(Process.GetCurrentProcess().Handle, + DS4Windows.Util.PROCESS_INFORMATION_CLASS.ProcessIoPriority, ref ioPrio, 4); + + // Force Normal Page Priority + IntPtr pagePrio = new IntPtr(5); + DS4Windows.Util.NtSetInformationProcess(Process.GetCurrentProcess().Handle, + DS4Windows.Util.PROCESS_INFORMATION_CLASS.ProcessPagePriority, ref pagePrio, 4); + + try + { + // another instance is already running if OpenExisting succeeds. + threadComEvent = EventWaitHandle.OpenExisting(SingleAppComEventName, + System.Security.AccessControl.EventWaitHandleRights.Synchronize | + System.Security.AccessControl.EventWaitHandleRights.Modify); + threadComEvent.Set(); // signal the other instance. + threadComEvent.Close(); + Current.Shutdown(); // Quit temp instance + return; + } + catch { /* don't care about errors */ } + + // Create the Event handle + threadComEvent = new EventWaitHandle(false, EventResetMode.ManualReset, SingleAppComEventName); + CreateTempWorkerThread(); + + CreateControlService(); + RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; + + DS4Windows.Global.FindConfigLocation(); + bool firstRun = DS4Windows.Global.firstRun; + if (firstRun) + { + DS4Forms.SaveWhere savewh = new DS4Forms.SaveWhere(false); + savewh.ShowDialog(); + } + + DS4Windows.Global.Load(); + if (!CreateConfDirSkeleton()) + { + MessageBox.Show($"Cannot create config folder structure in {DS4Windows.Global.appdatapath}. Exiting", + "DS4Windows", MessageBoxButton.OK, MessageBoxImage.Error); + Current.Shutdown(1); + } + + logHolder = new LoggerHolder(rootHub); + DispatcherUnhandledException += App_DispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + Logger logger = logHolder.Logger; + string version = DS4Windows.Global.exeversion; + logger.Info($"DS4Windows version {version}"); + //logger.Info("DS4Windows version 2.0"); + logger.Info("Logger created"); + + //DS4Windows.Global.ProfilePath[0] = "mixed"; + //DS4Windows.Global.LoadProfile(0, false, rootHub, false, false); + if (firstRun) + { + logger.Info("No config found. Creating default config"); + //Directory.CreateDirectory(DS4Windows.Global.appdatapath); + AttemptSave(); + + //Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Profiles\"); + //Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Macros\"); + DS4Windows.Global.SaveAsNewProfile(0, "Default"); + DS4Windows.Global.ProfilePath[0] = DS4Windows.Global.OlderProfilePath[0] = "Default"; + /*DS4Windows.Global.ProfilePath[1] = DS4Windows.Global.OlderProfilePath[1] = "Default"; + DS4Windows.Global.ProfilePath[2] = DS4Windows.Global.OlderProfilePath[2] = "Default"; + DS4Windows.Global.ProfilePath[3] = DS4Windows.Global.OlderProfilePath[3] = "Default"; + */ + logger.Info("Default config created"); + } + + skipSave = false; + + if (!DS4Windows.Global.LoadActions()) + { + DS4Windows.Global.CreateStdActions(); + } + + SetUICulture(DS4Windows.Global.UseLang); + DS4Windows.Global.LoadLinkedProfiles(); + DS4Forms.MainWindow window = new DS4Forms.MainWindow(parser); + MainWindow = window; + window.Show(); + HwndSource source = PresentationSource.FromVisual(window) as HwndSource; + CreateIPCClassNameMMF(source.Handle); + + window.CheckMinStatus(); + rootHub.LaunchHidGuardHelper(); + window.LateChecks(parser); + } + + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (!Current.Dispatcher.CheckAccess()) + { + Logger logger = logHolder.Logger; + Exception exp = e.ExceptionObject as Exception; + logger.Error($"Thread App Crashed with message {exp.Message}"); + logger.Error(exp.ToString()); + //LogManager.Flush(); + //LogManager.Shutdown(); + if (e.IsTerminating) + { + Dispatcher.Invoke(() => + { + rootHub?.PrepareAbort(); + CleanShutdown(); + }); + } + } + } + + private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + //Console.WriteLine("App Crashed"); + //Console.WriteLine(e.Exception.StackTrace); + Logger logger = logHolder.Logger; + logger.Error($"App Crashed with message {e.Exception.Message}"); + logger.Error(e.Exception.ToString()); + LogManager.Flush(); + LogManager.Shutdown(); + } + + private bool CreateConfDirSkeleton() + { + bool result = true; + try + { + Directory.CreateDirectory(DS4Windows.Global.appdatapath); + Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Profiles\"); + Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Logs\"); + //Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Macros\"); + } + catch (UnauthorizedAccessException) + { + result = false; + } + + + return result; + } + + private void AttemptSave() + { + if (!DS4Windows.Global.Save()) //if can't write to file + { + if (MessageBox.Show("Cannot write at current location\nCopy Settings to appdata?", "DS4Windows", + MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) + { + try + { + Directory.CreateDirectory(DS4Windows.Global.appDataPpath); + File.Copy(DS4Windows.Global.exedirpath + "\\Profiles.xml", + DS4Windows.Global.appDataPpath + "\\Profiles.xml"); + File.Copy(DS4Windows.Global.exedirpath + "\\Auto Profiles.xml", + DS4Windows.Global.appDataPpath + "\\Auto Profiles.xml"); + Directory.CreateDirectory(DS4Windows.Global.appDataPpath + "\\Profiles"); + foreach (string s in Directory.GetFiles(DS4Windows.Global.exedirpath + "\\Profiles")) + { + File.Copy(s, DS4Windows.Global.appDataPpath + "\\Profiles\\" + Path.GetFileName(s)); + } + } + catch { } + MessageBox.Show("Copy complete, please relaunch DS4Windows and remove settings from Program Directory", + "DS4Windows"); + } + else + { + MessageBox.Show("DS4Windows cannot edit settings here, This will now close", + "DS4Windows"); + } + + DS4Windows.Global.appdatapath = null; + skipSave = true; + Current.Shutdown(); + return; + } + } + + private void CheckOptions(ArgumentParser parser) + { + if (parser.HasErrors) + { + runShutdown = false; + exitApp = true; + Current.Shutdown(1); + } + else if (parser.Driverinstall) + { + CreateBaseThread(); + DS4Forms.WelcomeDialog dialog = new DS4Forms.WelcomeDialog(true); + dialog.ShowDialog(); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.ReenableDevice) + { + DS4Windows.DS4Devices.reEnableDevice(parser.DeviceInstanceId); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.Runtask) + { + StartupMethods.LaunchOldTask(); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.Command) + { + IntPtr hWndDS4WindowsForm = IntPtr.Zero; + hWndDS4WindowsForm = FindWindow(ReadIPCClassNameMMF(), "DS4Windows"); + if (hWndDS4WindowsForm != IntPtr.Zero) + { + COPYDATASTRUCT cds; + cds.lpData = IntPtr.Zero; + + try + { + cds.dwData = IntPtr.Zero; + cds.cbData = parser.CommandArgs.Length; + cds.lpData = Marshal.StringToHGlobalAnsi(parser.CommandArgs); + SendMessage(hWndDS4WindowsForm, DS4Forms.MainWindow.WM_COPYDATA, IntPtr.Zero, ref cds); + } + finally + { + if (cds.lpData != IntPtr.Zero) + Marshal.FreeHGlobal(cds.lpData); + } + } + + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + } + + private void CreateControlService() + { + controlThread = new Thread(() => { + rootHub = new DS4Windows.ControlService(); + DS4Windows.Program.rootHub = rootHub; + requestClient = new HttpClient(); + collectTimer = new Timer(GarbageTask, null, 30000, 30000); + + }); + controlThread.Priority = ThreadPriority.Normal; + controlThread.IsBackground = true; + controlThread.Start(); + while (controlThread.IsAlive) + Thread.SpinWait(500); + } + + private void CreateBaseThread() + { + controlThread = new Thread(() => { + DS4Windows.Program.rootHub = rootHub; + requestClient = new HttpClient(); + collectTimer = new Timer(GarbageTask, null, 30000, 30000); + }); + controlThread.Priority = ThreadPriority.Normal; + controlThread.IsBackground = true; + controlThread.Start(); + while (controlThread.IsAlive) + Thread.SpinWait(500); + } + + private void GarbageTask(object state) + { + GC.Collect(0, GCCollectionMode.Forced, false); + } + + private void CreateTempWorkerThread() + { + testThread = new Thread(SingleAppComThread_DoWork); + testThread.Priority = ThreadPriority.Lowest; + testThread.IsBackground = true; + testThread.Start(); + } + + private void SingleAppComThread_DoWork() + { + while (!exitComThread) + { + // check for a signal. + if (threadComEvent.WaitOne()) + { + threadComEvent.Reset(); + // The user tried to start another instance. We can't allow that, + // so bring the other instance back into view and enable that one. + // That form is created in another thread, so we need some thread sync magic. + if (!exitComThread) + { + Dispatcher.BeginInvoke((Action)(() => + { + MainWindow.Show(); + MainWindow.WindowState = WindowState.Normal; + })); + } + } + } + } + + public void CreateIPCClassNameMMF(IntPtr hWnd) + { + if (ipcClassNameMMA != null) return; // Already holding a handle to MMF file. No need to re-write the data + + try + { + StringBuilder wndClassNameStr = new StringBuilder(128); + if (GetClassName(hWnd, wndClassNameStr, wndClassNameStr.Capacity) != 0 && wndClassNameStr.Length > 0) + { + byte[] buffer = ASCIIEncoding.ASCII.GetBytes(wndClassNameStr.ToString()); + + ipcClassNameMMF = MemoryMappedFile.CreateNew("DS4Windows_IPCClassName.dat", 128); + ipcClassNameMMA = ipcClassNameMMF.CreateViewAccessor(0, buffer.Length); + ipcClassNameMMA.WriteArray(0, buffer, 0, buffer.Length); + // The MMF file is alive as long this process holds the file handle open + } + } + catch (Exception) + { + /* Eat all exceptions because errors here are not fatal for DS4Win */ + } + } + + private string ReadIPCClassNameMMF() + { + MemoryMappedFile mmf = null; + MemoryMappedViewAccessor mma = null; + + try + { + byte[] buffer = new byte[128]; + mmf = MemoryMappedFile.OpenExisting("DS4Windows_IPCClassName.dat"); + mma = mmf.CreateViewAccessor(0, 128); + mma.ReadArray(0, buffer, 0, buffer.Length); + return ASCIIEncoding.ASCII.GetString(buffer); + } + catch (Exception) + { + // Eat all exceptions + } + finally + { + if (mma != null) mma.Dispose(); + if (mmf != null) mmf.Dispose(); + } + + return null; + } + + private void SetUICulture(string culture) + { + try + { + //CultureInfo ci = new CultureInfo("ja"); + CultureInfo ci = CultureInfo.GetCultureInfo(culture); + LocalizeDictionary.Instance.SetCurrentThreadCulture = true; + LocalizeDictionary.Instance.Culture = ci; + // fixes the culture in threads + CultureInfo.DefaultThreadCurrentCulture = ci; + CultureInfo.DefaultThreadCurrentUICulture = ci; + //DS4WinWPF.Properties.Resources.Culture = ci; + Thread.CurrentThread.CurrentCulture = ci; + Thread.CurrentThread.CurrentUICulture = ci; + } + catch (CultureNotFoundException) { /* Skip setting culture that we cannot set */ } + } + + private void Application_Exit(object sender, ExitEventArgs e) + { + if (runShutdown) + { + Logger logger = logHolder.Logger; + logger.Info("Request App Shutdown"); + CleanShutdown(); + } + } + + private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) + { + Logger logger = logHolder.Logger; + logger.Info("User Session Ending"); + CleanShutdown(); + } + + private void CleanShutdown() + { + if (runShutdown) + { + if (rootHub != null) + { + Task.Run(() => + { + if (rootHub.running) + rootHub.Stop(); + }).Wait(); + } + + if (!skipSave) + { + DS4Windows.Global.Save(); + } + + exitComThread = true; + if (threadComEvent != null) + { + threadComEvent.Set(); // signal the other instance. + while (testThread.IsAlive) + Thread.SpinWait(500); + threadComEvent.Close(); + } + + if (ipcClassNameMMA != null) ipcClassNameMMA.Dispose(); + if (ipcClassNameMMF != null) ipcClassNameMMF.Dispose(); + + LogManager.Flush(); + LogManager.Shutdown(); + } + } + } +} diff --git a/DS4Windows/ArgumentParser.cs b/DS4Windows/ArgumentParser.cs new file mode 100644 index 0000000000..37a7693dd6 --- /dev/null +++ b/DS4Windows/ArgumentParser.cs @@ -0,0 +1,97 @@ + +using System.Collections.Generic; + +namespace DS4WinWPF +{ + public class ArgumentParser + { + private bool mini; + private bool stop; + private bool driverinstall; + private bool reenableDevice; + private string deviceInstanceId; + private bool runtask; + private bool command; + private string commandArgs; + + private Dictionary errors = + new Dictionary(); + + public bool Mini { get => mini; } + public bool Stop { get => stop; } + public bool Driverinstall { get => driverinstall; } + public bool ReenableDevice { get => reenableDevice; } + public bool Runtask { get => runtask; } + public bool Command { get => command; } + public string DeviceInstanceId { get => deviceInstanceId; } + public string CommandArgs { get => commandArgs; } + public Dictionary Errors { get => errors; } + + public bool HasErrors => errors.Count > 0; + + public void Parse(string[] args) + { + errors.Clear(); + //foreach (string arg in args) + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + switch(arg) + { + case "driverinstall": + case "-driverinstall": + driverinstall = true; + break; + + case "re-enabledevice": + case "-re-enabledevice": + reenableDevice = true; + if (i + 1 < args.Length) + { + deviceInstanceId = args[++i]; + } + + break; + + case "runtask": + case "-runtask": + runtask = true; + break; + + case "-stop": + stop = true; + break; + + case "-m": + mini = true; + break; + + case "command": + case "-command": + command = true; + if (i + 1 < args.Length) + { + i++; + string temp = args[i]; + if (temp.Length > 0 && temp.Length <= 256) + { + commandArgs = temp; + } + else + { + command = false; + errors["Command"] = "Command length is invalid"; + } + } + else + { + errors["Command"] = "Command string not given"; + } + break; + + default: break; + } + } + } + } +} diff --git a/DS4Windows/AutoProfileChecker.cs b/DS4Windows/AutoProfileChecker.cs new file mode 100644 index 0000000000..8dea7e575a --- /dev/null +++ b/DS4Windows/AutoProfileChecker.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Diagnostics; // StopWatch +using System.Threading; // Sleep +using System.Threading.Tasks; +using DS4Windows; + +namespace DS4WinWPF +{ + [SuppressUnmanagedCodeSecurity] + public class AutoProfileChecker + { + private AutoProfileHolder profileHolder; + private IntPtr prevForegroundWnd = IntPtr.Zero; + private uint prevForegroundProcessID; + private string prevForegroundProcessName = string.Empty; + private string prevForegroundWndTitleName = string.Empty; + private StringBuilder autoProfileCheckTextBuilder = new StringBuilder(1000); + private int autoProfileDebugLogLevel = 0; + private bool turnOffTemp; + private AutoProfileEntity tempAutoProfile; + private bool running; + + public int AutoProfileDebugLogLevel { get => autoProfileDebugLogLevel; set => autoProfileDebugLogLevel = value; } + public bool Running { get => running; set => running = value; } + + public delegate void ChangeServiceHandler(AutoProfileChecker sender, bool state); + public event ChangeServiceHandler RequestServiceChange; + + public AutoProfileChecker(AutoProfileHolder holder) + { + profileHolder = holder; + } + + public void Process() + { + string topProcessName, topWindowTitle; + bool turnOffDS4WinApp = false; + AutoProfileEntity matchedProfileEntity = null; + + if (GetTopWindowName(out topProcessName, out topWindowTitle)) + { + // Find a profile match based on autoprofile program path and wnd title list. + // The same program may set different profiles for each of the controllers, so we need an array of newProfileName[controllerIdx] values. + for (int i = 0, pathsLen = profileHolder.AutoProfileColl.Count; i < pathsLen; i++) + { + AutoProfileEntity tempEntity = profileHolder.AutoProfileColl[i]; + if (tempEntity.IsMatch(topProcessName, topWindowTitle)) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Rule#{i + 1} Path={tempEntity.path} Title={tempEntity.title}", false); + + // Matching autoprofile rule found + turnOffDS4WinApp = tempEntity.Turnoff; + matchedProfileEntity = tempEntity; + break; + } + } + + if (matchedProfileEntity != null) + { + bool forceLoadProfile = false; + + if (!turnOffDS4WinApp && turnOffTemp) + { + // DS4Win was temporarily turned off by another auto-profile rule. Turn DS4Win on before trying to load a new profile because otherwise the new profile won't do anything. + // Force load the profile when DS4Win service afer waking up DS4Win service to make sure that the new profile will be active. + turnOffTemp = false; + SetAndWaitServiceStatus(true); + forceLoadProfile = true; + } + + // Program match found. Check if the new profile is different than current profile of the controller. Load the new profile only if it is not already loaded. + for (int j = 0; j < 4; j++) + { + string tempname = matchedProfileEntity.ProfileNames[j]; + if (tempname != string.Empty && tempname != "(none)") + { + if ((Global.useTempProfile[j] && tempname != Global.tempprofilename[j]) || + (!Global.useTempProfile[j] && tempname != Global.ProfilePath[j]) || + forceLoadProfile) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. LoadProfile Controller {j + 1}={tempname}", false); + + Global.LoadTempProfile(j, tempname, true, Program.rootHub); // j is controller index, i is filename + //if (LaunchProgram[j] != string.Empty) Process.Start(LaunchProgram[j]); + } + else + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. LoadProfile Controller {j + 1}={tempname} (already loaded)", false); + } + } + } + + if (turnOffDS4WinApp) + { + turnOffTemp = true; + if (App.rootHub.running) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Turning DS4Windows temporarily off", false); + + SetAndWaitServiceStatus(false); + } + } + + tempAutoProfile = matchedProfileEntity; + } + else if (tempAutoProfile != null) + { + if (turnOffTemp && DS4Windows.Global.AutoProfileRevertDefaultProfile) + { + turnOffTemp = false; + if (!App.rootHub.running) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Turning DS4Windows on before reverting to default profile", false); + + SetAndWaitServiceStatus(true); + } + } + + tempAutoProfile = null; + for (int j = 0; j < 4; j++) + { + if (Global.useTempProfile[j]) + { + if (DS4Windows.Global.AutoProfileRevertDefaultProfile) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Unknown process. Reverting to default profile. Controller {j + 1}={Global.ProfilePath[j]} (default)", false); + + Global.LoadProfile(j, false, Program.rootHub); + } + else + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Unknown process. Existing profile left as active. Controller {j + 1}={Global.tempprofilename[j]}", false); + } + } + } + } + } + } + + private bool GetTopWindowName(out string topProcessName, out string topWndTitleName) + { + IntPtr hWnd = GetForegroundWindow(); + if (hWnd == IntPtr.Zero) + { + // Top window unknown or cannot acquire a handle. Return FALSE and return unknown process and wndTitle values + prevForegroundWnd = IntPtr.Zero; + prevForegroundProcessID = 0; + topProcessName = topWndTitleName = String.Empty; + return false; + } + + // + // If this function was called from "auto-profile watcher timer" then check cached "previous hWnd handle". If the current hWnd is the same + // as during the previous check then return cached previous wnd and name values (ie. foreground app and window are assumed to be the same, so no need to re-query names). + // This should optimize the auto-profile timer check process and causes less burden to .NET GC collector because StringBuffer is not re-allocated every second. + // + // Note! hWnd handles may be re-cycled but not during the lifetime of the window. This "cache" optimization still works because when an old window is closed + // then foreground window changes to something else and the cached prevForgroundWnd variable is updated to store the new hWnd handle. + // It doesn't matter even when the previously cached handle is recycled by WinOS to represent some other window (it is no longer used as a cached value anyway). + // + if (hWnd == prevForegroundWnd) + { + // The active window is still the same. Return cached process and wndTitle values and FALSE to indicate caller that no changes since the last call of this method + topProcessName = prevForegroundProcessName; + topWndTitleName = prevForegroundWndTitleName; + return false; + } + + prevForegroundWnd = hWnd; + + IntPtr hProcess = IntPtr.Zero; + uint lpdwProcessId = 0; + GetWindowThreadProcessId(hWnd, out lpdwProcessId); + + if (lpdwProcessId == prevForegroundProcessID) + { + topProcessName = prevForegroundProcessName; + } + else + { + prevForegroundProcessID = lpdwProcessId; + + hProcess = OpenProcess(0x0410, false, lpdwProcessId); + if (hProcess != IntPtr.Zero) GetModuleFileNameEx(hProcess, IntPtr.Zero, autoProfileCheckTextBuilder, autoProfileCheckTextBuilder.Capacity); + else autoProfileCheckTextBuilder.Clear(); + + prevForegroundProcessName = topProcessName = autoProfileCheckTextBuilder.Replace('/', '\\').ToString().ToLower(); + } + + GetWindowText(hWnd, autoProfileCheckTextBuilder, autoProfileCheckTextBuilder.Capacity); + prevForegroundWndTitleName = topWndTitleName = autoProfileCheckTextBuilder.ToString().ToLower(); + + + if (hProcess != IntPtr.Zero) CloseHandle(hProcess); + + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. PID={lpdwProcessId} Path={topProcessName} | WND={hWnd} Title={topWndTitleName}", false); + + return true; + } + + private void SetAndWaitServiceStatus(bool serviceRunningStatus) + { + // Start or Stop the service only if it is not already in the requested state + if (App.rootHub.running != serviceRunningStatus) + { + RequestServiceChange?.Invoke(this, serviceRunningStatus); + + // Wait until DS4Win app service is running or stopped (as requested by serviceRunningStatus value) or timeout. + // LoadProfile call fails if a new profile is loaded while DS4Win service is still in stopped state (ie the loaded temp profile doesn't do anything). + Stopwatch sw = new Stopwatch(); + sw.Start(); + while (App.rootHub.running != serviceRunningStatus && sw.Elapsed.TotalSeconds < 10) + { + Thread.SpinWait(1000); + } + Thread.SpinWait(1000); + } + } + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + + [DllImport("kernel32.dll")] + private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); + + [DllImport("kernel32.dll")] + private static extern bool CloseHandle(IntPtr handle); + + [DllImport("psapi.dll")] + private static extern uint GetModuleFileNameEx(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nSize); + } +} diff --git a/DS4Windows/AutoProfileHolder.cs b/DS4Windows/AutoProfileHolder.cs new file mode 100644 index 0000000000..9152e2a778 --- /dev/null +++ b/DS4Windows/AutoProfileHolder.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Xml; + +namespace DS4WinWPF +{ + public class AutoProfileHolder + { + private object _colLockobj = new object(); + private ObservableCollection autoProfileColl; + public ObservableCollection AutoProfileColl { get => autoProfileColl; } + //public Dictionary AutoProfileDict { get => autoProfileDict; } + + //private Dictionary autoProfileDict; + + public AutoProfileHolder() + { + autoProfileColl = new ObservableCollection(); + //autoProfileDict = new Dictionary(); + Load(); + + BindingOperations.EnableCollectionSynchronization(autoProfileColl, _colLockobj); + } + + private void Load() + { + try + { + XmlDocument doc = new XmlDocument(); + + if (!File.Exists(DS4Windows.Global.appdatapath + "\\Auto Profiles.xml")) + return; + + doc.Load(DS4Windows.Global.appdatapath + "\\Auto Profiles.xml"); + XmlNodeList programslist = doc.SelectNodes("Programs/Program"); + foreach (XmlNode x in programslist) + { + string path = x.Attributes["path"]?.Value ?? string.Empty; + string title = x.Attributes["title"]?.Value ?? string.Empty; + AutoProfileEntity autoprof = new AutoProfileEntity(path, title); + + XmlNode item; + for (int i = 0; i < 4; i++) + { + item = x.SelectSingleNode($"Controller{i+1}"); + if (item != null) + { + autoprof.ProfileNames[i] = item.InnerText; + } + } + + item = x.SelectSingleNode($"TurnOff"); + if (item != null && bool.TryParse(item.InnerText, out bool turnoff)) + { + autoprof.Turnoff = turnoff; + } + + autoProfileColl.Add(autoprof); + //autoProfileDict.Add(path, autoprof); + } + } + catch (Exception) { } + } + + public bool Save(string m_Profile) + { + XmlDocument doc = new XmlDocument(); + XmlNode Node; + bool saved = true; + try + { + Node = doc.CreateXmlDeclaration("1.0", "utf-8", string.Empty); + doc.AppendChild(Node); + + Node = doc.CreateComment(string.Format(" Auto-Profile Configuration Data. {0} ", DateTime.Now)); + doc.AppendChild(Node); + + Node = doc.CreateWhitespace("\r\n"); + doc.AppendChild(Node); + + Node = doc.CreateNode(XmlNodeType.Element, "Programs", ""); + doc.AppendChild(Node); + foreach (AutoProfileEntity entity in autoProfileColl) + { + XmlElement el = doc.CreateElement("Program"); + el.SetAttribute("path", entity.Path); + if (!string.IsNullOrEmpty(entity.Title)) + { + el.SetAttribute("title", entity.Title); + } + + el.AppendChild(doc.CreateElement("Controller1")).InnerText = entity.ProfileNames[0]; + el.AppendChild(doc.CreateElement("Controller2")).InnerText = entity.ProfileNames[1]; + el.AppendChild(doc.CreateElement("Controller3")).InnerText = entity.ProfileNames[2]; + el.AppendChild(doc.CreateElement("Controller4")).InnerText = entity.ProfileNames[3]; + el.AppendChild(doc.CreateElement("TurnOff")).InnerText = entity.Turnoff.ToString(); + + Node.AppendChild(el); + } + + doc.Save(m_Profile); + } + catch (Exception) { saved = false; } + return saved; + } + + public void Remove(AutoProfileEntity item) + { + //autoProfileDict.Remove(item.Path); + autoProfileColl.Remove(item); + } + } + + public class AutoProfileEntity + { + public string path = string.Empty; + public string title = string.Empty; + private string path_lowercase; + private string title_lowercase; + private bool turnoff; + private string[] profileNames = new string[4] { string.Empty, string.Empty, + string.Empty, string.Empty }; + public const string NONE_STRING = "(none)"; + + public string Path { get => path; set => SetSearchPath(value); } + public string Title { get => title; set => SetSearchTitle(value); } + public bool Turnoff { get => turnoff; set => turnoff = value; } + public string[] ProfileNames { get => profileNames; set => profileNames = value; } + + public AutoProfileEntity(string pathStr, string titleStr) + { + // Initialize autoprofile search keywords(xxx_tolower).To improve performance the search keyword is pre - calculated in xxx_tolower variables, + // so autoprofile timer thread doesn't have to create substrings/replace/tolower string instances every second over and over again. + SetSearchPath(pathStr); + SetSearchTitle(titleStr); + } + + public bool IsMatch(string searchPath, string searchTitle) + { + bool bPathMatched = true; + bool bTitleMwatched = true; + + if (!string.IsNullOrEmpty(path_lowercase)) + { + bPathMatched = (path_lowercase == searchPath + || (path[0] == '^' && searchPath.StartsWith(path_lowercase)) + || (path[path.Length - 1] == '$' && searchPath.EndsWith(path_lowercase)) + || (path[0] == '*' && searchPath.Contains(path_lowercase)) + ); + } + + if (bPathMatched && !string.IsNullOrEmpty(title_lowercase)) + { + bTitleMwatched = (title_lowercase == searchTitle + || (title[0] == '^' && searchTitle.StartsWith(title_lowercase)) + || (title[title.Length - 1] == '$' && searchTitle.EndsWith(title_lowercase)) + || (title[0] == '*' && searchTitle.Contains(title_lowercase)) + ); + } + + // If both path and title defined in autoprofile entry then do AND condition (ie. both path and title should match) + return bPathMatched && bTitleMwatched; + } + + private void SetSearchPath(string pathStr) + { + if (!string.IsNullOrEmpty(pathStr)) + { + path = pathStr; + path_lowercase = path.ToLower().Replace('/', '\\'); + + if (path.Length >= 2) + { + if (path[0] == '^') path_lowercase = path_lowercase.Substring(1); + else if (path[path.Length - 1] == '$') path_lowercase = path_lowercase.Substring(0, path_lowercase.Length - 1); + else if (path[0] == '*') path_lowercase = path_lowercase.Substring(1); + } + } + else path = path_lowercase = string.Empty; + } + + private void SetSearchTitle(string titleStr) + { + if (!string.IsNullOrEmpty(titleStr)) + { + title = titleStr; + title_lowercase = title.ToLower(); + + if (title.Length >= 2) + { + if (title[0] == '^') title_lowercase = title_lowercase.Substring(1); + else if (title[title.Length - 1] == '$') title_lowercase = title_lowercase.Substring(0, title_lowercase.Length - 1); + else if (title[0] == '*') title_lowercase = title_lowercase.Substring(1); + } + } + else title = title_lowercase = string.Empty; + } + } +} diff --git a/DS4Windows/BezierCurveEditor/BezierCurve.cs b/DS4Windows/BezierCurveEditor/BezierCurve.cs new file mode 100644 index 0000000000..6d5edd5fb8 --- /dev/null +++ b/DS4Windows/BezierCurveEditor/BezierCurve.cs @@ -0,0 +1,380 @@ +/* MIT License + * + * KeySpline - use bezier curve for transition easing function + * Copyright (c) 2012 Gaetan Renaudeau (GRE) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/* KeySpline - use bezier curve for transition easing function is inspired from Firefox's nsSMILKeySpline.cpp */ + +/* +* This file contains the original bezier curve code (see comments above) and calculations ported as C# code. The original code was in JavaScript. +* +* This file has few customizations and optimizations for the needs of DS4Windows application (see https://github.com/Ryochan7/DS4Windows). +* MIT License. Permission is hereby granted, free of charge, to any person to do whatever they want with this C# ported version of BezierCurve calculation code +* as long this part of the code is open sourced and usage is in compliance with the above shown original license, also. +* +* Copyright (c) 2019, MIKA-N (https://github.com/mika-n). +* +* The original JavaScript version of bezier easing made by GRE (https://github.com/gre/bezier-easing). +* +* Usage: +* BezierCurve.InitBezierCurve = Initialize bezier curve and output lookup table. Must be called at least once before calling GetBezierEasing method (or accessing lookup table directly) to re-map analog axis input. +* BezierCurve.GetBezierEasing = Return re-mapped output value for an input axis value (or alternatively directly accessing the lookup table BezierCurve.arrayBezierLUT[inputVal] if even tiny CPU cycles matter) +* +*/ +using System; + +namespace DS4Windows +{ + public class BezierCurve + { + public enum AxisType { LSRS, L2R2, SA }; + + private static int kSplineTableSize = 11; + private static double kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); + private double[] arraySampleValues; + + // These values are established by empiricism with tests (tradeoff: performance VS precision) (comment by GRE) + private static int NEWTON_ITERATIONS = 4; + private static double NEWTON_MIN_SLOPE = 0.001; + private static double SUBDIVISION_PRECISION = 0.0000001; + private static int SUBDIVISION_MAX_ITERATIONS = 10; + + private double mX1 = 0, mY1 = 0, mX2 = 0, mY2 = 0; // Bezier curve definition (0, 0, 0, 0 = Linear. 99, 99, 0, 0 = Pre-defined hard-coded EnhancedPrecision curve) + + // Set or Get string representation of the bezier curve definition value (Note! Set doesn't initialize the lookup table. InitBezierCurve needs to be called to actually initalize the calculation) + public string AsString + { + get { return ($"{mX1}, {mY1}, {mX2}, {mY2}"); } + set + { + // Set bezier curve defintion from a string value (4 comma separated decimals). If any of the string values are invalid then set curve as linear "zero" curve + string[] bezierDef = value.Split(new Char[] { ',' }, 4); + if (bezierDef.Length < 4 || !Double.TryParse(bezierDef[0], out mX1) || !Double.TryParse(bezierDef[1], out mY1) || !Double.TryParse(bezierDef[2], out mX2) || !Double.TryParse(bezierDef[3], out mY2) ) + mX1 = mY1 = mX2 = mY2 = 0; + } + } + + // Custom definition set by DS4Windows options screens. This string is not validated (ie. the value is as user entered it and could be an invalid curve definition). This value is saved in a profile XML file. + public string CustomDefinition { get; set; } + public override string ToString() { return this.CustomDefinition; } + + public AxisType axisType; // Axis type of curve object (LS/RS/R2/L2/SA) + private double axisMaxDouble; // Max range of axis (range of positive values) + private double axisCenterPosDouble; // Center pos of axis (LS/RS has 128 as "stick center", other axies has 0 as zero center point) + + // Lookup result table is always either in 0..128 or 0..255 range depending on the DS4 analog axis range. LUT table set as public to let DS4Win reading thread to access it directly (every CPU cycle matters) + public byte[] arrayBezierLUT = null; + + public BezierCurve() + { + CustomDefinition = ""; + } + + public bool InitBezierCurve(string bezierCurveDefinition, AxisType gamepadAxisType, bool setCustomDefinitionProperty = false) + { + if (setCustomDefinitionProperty) + this.CustomDefinition = bezierCurveDefinition; + + this.AsString = bezierCurveDefinition; + return InitBezierCurve(mX1, mY1, mX2, mY2, gamepadAxisType); + } + + public bool InitBezierCurve(double x1, double y1, double x2, double y2, AxisType gamepadAxisType) + { + bool bRetValue = true; + + if (arrayBezierLUT == null) + arrayBezierLUT = new byte[256]; + + // Axis type and max range per axis + axisType = gamepadAxisType; + switch (gamepadAxisType) + { + case AxisType.LSRS: + axisMaxDouble = 127; // DS4 LS/RS axis has a "center position" at 128. Left turn has 0..127 positions and right turn 128..255 positions + axisCenterPosDouble = 128; + break; + + case AxisType.L2R2: + axisMaxDouble = 255; // L2R2 analog trigger range 0..255 + axisCenterPosDouble = 0; + break; + + default: + axisMaxDouble = 128; // SixAxis x/z/y range 0..128 + axisCenterPosDouble = 0; + break; + } + + // If x1 = 99.0 then this is probably just a dummy bezier curve value + if (x1 == 99.0) + { + mX1 = 99.0; + mY1 = y1; + mX2 = x2; + mY2 = y2; + + switch (y1) + { + case 91.0: return InitEnhancedPrecision_91(); + case 92.0: return InitQuadric_92(); + case 93.0: return InitCubic_93(); + case 94.0: return InitEaseoutQuad_94(); + case 95.0: return InitEaseoutCubic_95(); + } + } + + if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) + { + // throw new Exception("INVALID VALUE. BezierCurve X1 and X2 should be in [0, 1] range"); + AppLogger.LogToGui($"WARNING. Invalid custom bezier curve \"{x1}, {y1}, {x2}, {y2}\" in {gamepadAxisType} axis. x1 and x2 should be in 0..1 range. Using linear curve.", true); + mX1 = mY1 = mX2 = mY2 = 0; + bRetValue = false; + } + else + { + mX1 = x1; + mY1 = y1; + mX2 = x2; + mY2 = y2; + } + + // If this is linear definition then init the lookup table with 1-on-1 mapping + if (x1 == 0 && y1 == 0 && ((x2 == 0 && y2 == 0) || (x2 == 1 && y2 == 1))) + { + for (int idx = 0; idx <= 255; idx++) + arrayBezierLUT[idx] = (byte)idx; + + return bRetValue; + } + + try + { + arraySampleValues = new double[BezierCurve.kSplineTableSize]; + for (int idx = 0; idx < BezierCurve.kSplineTableSize; idx++) + arraySampleValues[idx] = CalcBezier(idx * BezierCurve.kSampleStepSize, mX1, mX2); + + // Pre-populate lookup result table for GetBezierEasing function (performance optimization) + for (byte idx = 0; idx <= (byte)axisMaxDouble; idx++) + { + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(idx / axisMaxDouble), mY1, mY2) * axisMaxDouble), axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (gamepadAxisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + } + finally + { + arraySampleValues = null; + } + + return bRetValue; + } + + // Initialize a special "hard-coded" and pre-defined EnhancedPrecision output curve as a lookup result table + private bool InitEnhancedPrecision_91() + { + double abs, output; + + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + abs = idx / axisMaxDouble; + if (abs <= 0.4) + output = 0.55 * abs; + else if (abs <= 0.75) + output = abs - 0.18; + else //if (abs > 0.75) + output = (abs * 1.72) - 0.72; + + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(output * axisMaxDouble + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitQuadric_92() + { + double temp; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + temp = idx / axisMaxDouble; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((temp * temp * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitCubic_93() + { + double temp; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + temp = idx / axisMaxDouble; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((temp * temp * temp * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitEaseoutQuad_94() + { + double abs, output; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + abs = idx / axisMaxDouble; + output = abs * (abs - 2.0); + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((-1.0 * output * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitEaseoutCubic_95() + { + double inner, output; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + inner = (idx / axisMaxDouble) - 1.0; + output = (inner * inner * inner) + 1.0; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((1.0 * output * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + public byte GetBezierEasing(byte inputXValue) + { + unchecked + { + return (arrayBezierLUT == null ? inputXValue : arrayBezierLUT[inputXValue]); + //return (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(inputXValue / 255), mY1, mY2) * 255), 255)); + } + } + + private double A(double aA1, double aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + private double B(double aA1, double aA2) { return 3.0 * aA2 - 6.0 * aA1; } + private double C(double aA1) { return 3.0 * aA1; } + + private double CalcBezier(double aT, double aA1, double aA2) + { + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; + } + + private double getTForX(double aX) + { + double intervalStart = 0.0; + int currentSample = 1; + int lastSample = kSplineTableSize - 1; + + for (; currentSample != lastSample && arraySampleValues[currentSample] <= aX; ++currentSample) + { + intervalStart += kSampleStepSize; + } + --currentSample; + + // Interpolate to provide an initial guess for t + double dist = (aX - arraySampleValues[currentSample]) / (arraySampleValues[currentSample + 1] - arraySampleValues[currentSample]); + double guessForT = intervalStart + dist * kSampleStepSize; + + double initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) + { + return newtonRaphsonIterate(aX, guessForT /*, mX1, mX2*/); + } + else if (initialSlope == 0.0) + { + return guessForT; + } + else + { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize /*, mX1, mX2*/); + } + } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + private double getSlope(double aT, double aA1, double aA2) + { + return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + } + + private double newtonRaphsonIterate(double aX, double aGuessT /*, double mX1, double mX2*/) + { + for (int i = 0; i < BezierCurve.NEWTON_ITERATIONS; ++i) + { + double currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope == 0.0) + { + return aGuessT; + } + double currentX = CalcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + private double binarySubdivide(double aX, double aA, double aB /*, double mX1, double mX2*/) + { + double currentX, currentT, i = 0; + do + { + currentT = aA + (aB - aA) / 2.0; + currentX = CalcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) + { + aB = currentT; + } + else + { + aA = currentT; + } + } while (Math.Abs(currentX) > BezierCurve.SUBDIVISION_PRECISION && ++i < BezierCurve.SUBDIVISION_MAX_ITERATIONS); + + return currentT; + } + + } +} diff --git a/DS4Windows/BezierCurveEditor/build.js b/DS4Windows/BezierCurveEditor/build.js new file mode 100644 index 0000000000..278059de0a --- /dev/null +++ b/DS4Windows/BezierCurveEditor/build.js @@ -0,0 +1,10114 @@ +! function e(t, n, r) { + function o(i, s) { + if (!n[i]) { + if (!t[i]) { + var u = "function" == typeof require && require; + if (!s && u) return u(i, !0); + if (a) return a(i, !0); + var c = new Error("Cannot find module '" + i + "'"); + throw c.code = "MODULE_NOT_FOUND", c + } + var l = n[i] = { + exports: {} + }; + t[i][0].call(l.exports, function(e) { + var n = t[i][1][e]; + return o(n ? n : e) + }, l, l.exports, e, t, n, r) + } + return n[i].exports + } + for (var a = "function" == typeof require && require, i = 0; i < r.length; i++) o(r[i]); + return o +}({ + 1: [function(e) { + "use strict"; + var t = function(e) { + return e && e.__esModule ? e["default"] : e + }, + n = function() { + function e(e, t) { + for (var n in t) { + var r = t[n]; + r.configurable = !0, r.value && (r.writable = !0) + } + Object.defineProperties(e, t) + } + return function(t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t + } + }(), + r = function f(e, t, n) { + var r = Object.getOwnPropertyDescriptor(e, t); + if (void 0 === r) { + var o = Object.getPrototypeOf(e); + return null === o ? void 0 : f(o, t, n) + } + if ("value" in r && r.writable) return r.value; + var a = r.get; + return void 0 === a ? void 0 : a.call(n) + }, + o = function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (e.__proto__ = t) + }, + a = function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }, + i = t(e("react/addons")), + s = t(e("..")), + u = t(e("../package.json")), + c = t(e("raf")); + window.Perf = i.addons.Perf; + var l = { + color: "#0000c6", + textDecoration: "none" + }, + p = { + display: "inline-block", + margin: "5px" + }, + qryVariableValue = function(variableName) + { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i o; ++o) { + var a = v(r, e, c); + if (0 === a) return r; + var i = h(r, e, c) - t; + r -= i / a + } + return r + } + + function y() { + for (var t = 0; i > t; ++t) _[t] = h(t * s, e, c) + } + + function g(t, n, r) { + var i, s, u = 0; + do s = n + (r - n) / 2, i = h(s, e, c) - t, i > 0 ? r = s : n = s; while (Math.abs(i) > o && ++u < a); + return s + } + + function E(t) { + for (var n = 0, o = 1, a = i - 1; o != a && _[o] <= t; ++o) n += s; + --o; + var u = (t - _[o]) / (_[o + 1] - _[o]), + l = n + u * s, + p = v(l, e, c); + return p >= r ? m(t, l) : 0 === p ? l : g(t, n, n + s) + } + + function C() { + N = !0, (e != t || c != l) && y() + } + if (4 !== arguments.length) throw new Error("BezierEasing requires 4 arguments."); + for (var b = 0; 4 > b; ++b) + if ("number" != typeof arguments[b] || isNaN(arguments[b]) || !isFinite(arguments[b])) throw new Error("BezierEasing arguments should be integers."); + if (0 > e || e > 1 || 0 > c || c > 1) throw new Error("BezierEasing x values must be in [0, 1] range."); + var _ = u ? new Float32Array(i) : new Array(i), + N = !1, + O = function(n) { + return N || C(), e === t && c === l ? n : 0 === n ? 0 : 1 === n ? 1 : h(E(n), t, l) + }; + O.getControlPoints = function() { + return [{ + x: e, + y: t + }, { + x: c, + y: l + }] + }; + var R = [e, t, c, l], + D = "BezierEasing(" + R + ")"; + O.toString = function() { + return D + }; + var w = "cubic-bezier(" + R + ")"; + return O.toCSS = function() { + return w + }, O + } + var t = this, + n = 4, + r = .001, + o = 1e-7, + a = 10, + i = 11, + s = 1 / (i - 1), + u = "Float32Array" in t; + return e.css = { + ease: e(.25, .1, .25, 1), + linear: e(0, 0, 1, 1), + "ease-in": e(.42, 0, 1, 1), + "ease-out": e(0, 0, .58, 1), + "ease-in-out": e(.42, 0, .58, 1) + }, e + }) + }, {}], + 6: [function(e, t) { + "use strict"; + + function n(e) { + if (null == e) throw new TypeError("Object.assign cannot be called with null or undefined"); + return Object(e) + } + t.exports = Object.assign || function(e) { + for (var t, r, o = n(e), a = 1; a < arguments.length; a++) { + t = arguments[a], r = Object.keys(Object(t)); + for (var i = 0; i < r.length; i++) o[r[i]] = t[r[i]] + } + return o + } + }, {}], + 7: [function(e, t) { + t.exports = e("./lib/ReactWithAddons") + }, { + "./lib/ReactWithAddons": 107 + }], + 8: [function(e, t) { + "use strict"; + var n = e("./focusNode"), + r = { + componentDidMount: function() { + this.props.autoFocus && n(this.getDOMNode()) + } + }; + t.exports = r + }, { + "./focusNode": 141 + }], + 9: [function(e, t) { + "use strict"; + + function n() { + var e = window.opera; + return "object" == typeof e && "function" == typeof e.version && parseInt(e.version(), 10) <= 12 + } + + function r(e) { + return (e.ctrlKey || e.altKey || e.metaKey) && !(e.ctrlKey && e.altKey) + } + + function o(e) { + switch (e) { + case w.topCompositionStart: + return M.compositionStart; + case w.topCompositionEnd: + return M.compositionEnd; + case w.topCompositionUpdate: + return M.compositionUpdate + } + } + + function a(e, t) { + return e === w.topKeyDown && t.keyCode === C + } + + function i(e, t) { + switch (e) { + case w.topKeyUp: + return -1 !== E.indexOf(t.keyCode); + case w.topKeyDown: + return t.keyCode !== C; + case w.topKeyPress: + case w.topMouseDown: + case w.topBlur: + return !0; + default: + return !1 + } + } + + function s(e) { + var t = e.detail; + return "object" == typeof t && "data" in t ? t.data : null + } + + function u(e, t, n, r) { + var u, c; + if (b ? u = o(e) : T ? i(e, r) && (u = M.compositionEnd) : a(e, r) && (u = M.compositionStart), !u) return null; + O && (T || u !== M.compositionStart ? u === M.compositionEnd && T && (c = T.getData()) : T = v.getPooled(t)); + var l = m.getPooled(u, n, r); + if (c) l.data = c; + else { + var p = s(r); + null !== p && (l.data = p) + } + return f.accumulateTwoPhaseDispatches(l), l + } + + function c(e, t) { + switch (e) { + case w.topCompositionEnd: + return s(t); + case w.topKeyPress: + var n = t.which; + return n !== R ? null : (x = !0, D); + case w.topTextInput: + var r = t.data; + return r === D && x ? null : r; + default: + return null + } + } + + function l(e, t) { + if (T) { + if (e === w.topCompositionEnd || i(e, t)) { + var n = T.getData(); + return v.release(T), T = null, n + } + return null + } + switch (e) { + case w.topPaste: + return null; + case w.topKeyPress: + return t.which && !r(t) ? String.fromCharCode(t.which) : null; + case w.topCompositionEnd: + return O ? null : t.data; + default: + return null + } + } + + function p(e, t, n, r) { + var o; + if (o = N ? c(e, r) : l(e, r), !o) return null; + var a = y.getPooled(M.beforeInput, n, r); + return a.data = o, f.accumulateTwoPhaseDispatches(a), a + } + var d = e("./EventConstants"), + f = e("./EventPropagators"), + h = e("./ExecutionEnvironment"), + v = e("./FallbackCompositionState"), + m = e("./SyntheticCompositionEvent"), + y = e("./SyntheticInputEvent"), + g = e("./keyOf"), + E = [9, 13, 27, 32], + C = 229, + b = h.canUseDOM && "CompositionEvent" in window, + _ = null; + h.canUseDOM && "documentMode" in document && (_ = document.documentMode); + var N = h.canUseDOM && "TextEvent" in window && !_ && !n(), + O = h.canUseDOM && (!b || _ && _ > 8 && 11 >= _), + R = 32, + D = String.fromCharCode(R), + w = d.topLevelTypes, + M = { + beforeInput: { + phasedRegistrationNames: { + bubbled: g({ + onBeforeInput: null + }), + captured: g({ + onBeforeInputCapture: null + }) + }, + dependencies: [w.topCompositionEnd, w.topKeyPress, w.topTextInput, w.topPaste] + }, + compositionEnd: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionEnd: null + }), + captured: g({ + onCompositionEndCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionEnd, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + }, + compositionStart: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionStart: null + }), + captured: g({ + onCompositionStartCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionStart, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + }, + compositionUpdate: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionUpdate: null + }), + captured: g({ + onCompositionUpdateCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionUpdate, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + } + }, + x = !1, + T = null, + P = { + eventTypes: M, + extractEvents: function(e, t, n, r) { + return [u(e, t, n, r), p(e, t, n, r)] + } + }; + t.exports = P + }, { + "./EventConstants": 22, + "./EventPropagators": 27, + "./ExecutionEnvironment": 28, + "./FallbackCompositionState": 29, + "./SyntheticCompositionEvent": 113, + "./SyntheticInputEvent": 117, + "./keyOf": 164 + }], + 10: [function(e, t) { + (function(n) { + var r = e("./invariant"), + o = { + addClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), 'CSSCore.addClass takes only a single class name. "%s" contains multiple classes.', t) : r(!/\s/.test(t)), t && (e.classList ? e.classList.add(t) : o.hasClass(e, t) || (e.className = e.className + " " + t)), e + }, + removeClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), 'CSSCore.removeClass takes only a single class name. "%s" contains multiple classes.', t) : r(!/\s/.test(t)), t && (e.classList ? e.classList.remove(t) : o.hasClass(e, t) && (e.className = e.className.replace(new RegExp("(^|\\s)" + t + "(?:\\s|$)", "g"), "$1").replace(/\s+/g, " ").replace(/^\s*|\s*$/g, ""))), e + }, + conditionClass: function(e, t, n) { + return (n ? o.addClass : o.removeClass)(e, t) + }, + hasClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), "CSS.hasClass takes only a single class name.") : r(!/\s/.test(t)), e.classList ? !!t && e.classList.contains(t) : (" " + e.className + " ").indexOf(" " + t + " ") > -1 + } + }; + t.exports = o + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 11: [function(e, t) { + "use strict"; + + function n(e, t) { + return e + t.charAt(0).toUpperCase() + t.substring(1) + } + var r = { + boxFlex: !0, + boxFlexGroup: !0, + columnCount: !0, + flex: !0, + flexGrow: !0, + flexShrink: !0, + fontWeight: !0, + lineClamp: !0, + lineHeight: !0, + opacity: !0, + order: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0, + fillOpacity: !0, + strokeOpacity: !0 + }, + o = ["Webkit", "ms", "Moz", "O"]; + Object.keys(r).forEach(function(e) { + o.forEach(function(t) { + r[n(t, e)] = r[e] + }) + }); + var a = { + background: { + backgroundImage: !0, + backgroundPosition: !0, + backgroundRepeat: !0, + backgroundColor: !0 + }, + border: { + borderWidth: !0, + borderStyle: !0, + borderColor: !0 + }, + borderBottom: { + borderBottomWidth: !0, + borderBottomStyle: !0, + borderBottomColor: !0 + }, + borderLeft: { + borderLeftWidth: !0, + borderLeftStyle: !0, + borderLeftColor: !0 + }, + borderRight: { + borderRightWidth: !0, + borderRightStyle: !0, + borderRightColor: !0 + }, + borderTop: { + borderTopWidth: !0, + borderTopStyle: !0, + borderTopColor: !0 + }, + font: { + fontStyle: !0, + fontVariant: !0, + fontWeight: !0, + fontSize: !0, + lineHeight: !0, + fontFamily: !0 + } + }, + i = { + isUnitlessNumber: r, + shorthandPropertyExpansions: a + }; + t.exports = i + }, {}], + 12: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./CSSProperty"), + o = e("./ExecutionEnvironment"), + a = e("./camelizeStyleName"), + i = e("./dangerousStyleValue"), + s = e("./hyphenateStyleName"), + u = e("./memoizeStringOnly"), + c = e("./warning"), + l = u(function(e) { + return s(e) + }), + p = "cssFloat"; + if (o.canUseDOM && void 0 === document.documentElement.style.cssFloat && (p = "styleFloat"), "production" !== n.env.NODE_ENV) var d = /^(?:webkit|moz|o)[A-Z]/, + f = /;\s*$/, + h = {}, + v = {}, + m = function(e) { + h.hasOwnProperty(e) && h[e] || (h[e] = !0, "production" !== n.env.NODE_ENV ? c(!1, "Unsupported style property %s. Did you mean %s?", e, a(e)) : null) + }, + y = function(e) { + h.hasOwnProperty(e) && h[e] || (h[e] = !0, "production" !== n.env.NODE_ENV ? c(!1, "Unsupported vendor-prefixed style property %s. Did you mean %s?", e, e.charAt(0).toUpperCase() + e.slice(1)) : null) + }, + g = function(e, t) { + v.hasOwnProperty(t) && v[t] || (v[t] = !0, "production" !== n.env.NODE_ENV ? c(!1, 'Style property values shouldn\'t contain a semicolon. Try "%s: %s" instead.', e, t.replace(f, "")) : null) + }, + E = function(e, t) { + e.indexOf("-") > -1 ? m(e) : d.test(e) ? y(e) : f.test(t) && g(e, t) + }; + var C = { + createMarkupForStyles: function(e) { + var t = ""; + for (var r in e) + if (e.hasOwnProperty(r)) { + var o = e[r]; + "production" !== n.env.NODE_ENV && E(r, o), null != o && (t += l(r) + ":", t += i(r, o) + ";") + } return t || null + }, + setValueForStyles: function(e, t) { + var o = e.style; + for (var a in t) + if (t.hasOwnProperty(a)) { + "production" !== n.env.NODE_ENV && E(a, t[a]); + var s = i(a, t[a]); + if ("float" === a && (a = p), s) o[a] = s; + else { + var u = r.shorthandPropertyExpansions[a]; + if (u) + for (var c in u) o[c] = ""; + else o[a] = "" + } + } + } + }; + t.exports = C + }).call(this, e("_process")) + }, { + "./CSSProperty": 11, + "./ExecutionEnvironment": 28, + "./camelizeStyleName": 128, + "./dangerousStyleValue": 135, + "./hyphenateStyleName": 155, + "./memoizeStringOnly": 166, + "./warning": 178, + _process: 2 + }], + 13: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this._callbacks = null, this._contexts = null + } + var o = e("./PooledClass"), + a = e("./Object.assign"), + i = e("./invariant"); + a(r.prototype, { + enqueue: function(e, t) { + this._callbacks = this._callbacks || [], this._contexts = this._contexts || [], this._callbacks.push(e), this._contexts.push(t) + }, + notifyAll: function() { + var e = this._callbacks, + t = this._contexts; + if (e) { + "production" !== n.env.NODE_ENV ? i(e.length === t.length, "Mismatched list of contexts in callback queue") : i(e.length === t.length), this._callbacks = null, this._contexts = null; + for (var r = 0, o = e.length; o > r; r++) e[r].call(t[r]); + e.length = 0, t.length = 0 + } + }, + reset: function() { + this._callbacks = null, this._contexts = null + }, + destructor: function() { + this.reset() + } + }), o.addPoolingTo(r), t.exports = r + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./PooledClass": 36, + "./invariant": 157, + _process: 2 + }], + 14: [function(e, t) { + "use strict"; + + function n(e) { + return "SELECT" === e.nodeName || "INPUT" === e.nodeName && "file" === e.type + } + + function r(e) { + var t = _.getPooled(w.change, x, e); + E.accumulateTwoPhaseDispatches(t), b.batchedUpdates(o, t) + } + + function o(e) { + g.enqueueEvents(e), g.processEventQueue() + } + + function a(e, t) { + M = e, x = t, M.attachEvent("onchange", r) + } + + function i() { + M && (M.detachEvent("onchange", r), M = null, x = null) + } + + function s(e, t, n) { + return e === D.topChange ? n : void 0 + } + + function u(e, t, n) { + e === D.topFocus ? (i(), a(t, n)) : e === D.topBlur && i() + } + + function c(e, t) { + M = e, x = t, T = e.value, P = Object.getOwnPropertyDescriptor(e.constructor.prototype, "value"), Object.defineProperty(M, "value", k), M.attachEvent("onpropertychange", p) + } + + function l() { + M && (delete M.value, M.detachEvent("onpropertychange", p), M = null, x = null, T = null, P = null) + } + + function p(e) { + if ("value" === e.propertyName) { + var t = e.srcElement.value; + t !== T && (T = t, r(e)) + } + } + + function d(e, t, n) { + return e === D.topInput ? n : void 0 + } + + function f(e, t, n) { + e === D.topFocus ? (l(), c(t, n)) : e === D.topBlur && l() + } + + function h(e) { + return e !== D.topSelectionChange && e !== D.topKeyUp && e !== D.topKeyDown || !M || M.value === T ? void 0 : (T = M.value, x) + } + + function v(e) { + return "INPUT" === e.nodeName && ("checkbox" === e.type || "radio" === e.type) + } + + function m(e, t, n) { + return e === D.topClick ? n : void 0 + } + var y = e("./EventConstants"), + g = e("./EventPluginHub"), + E = e("./EventPropagators"), + C = e("./ExecutionEnvironment"), + b = e("./ReactUpdates"), + _ = e("./SyntheticEvent"), + N = e("./isEventSupported"), + O = e("./isTextInputElement"), + R = e("./keyOf"), + D = y.topLevelTypes, + w = { + change: { + phasedRegistrationNames: { + bubbled: R({ + onChange: null + }), + captured: R({ + onChangeCapture: null + }) + }, + dependencies: [D.topBlur, D.topChange, D.topClick, D.topFocus, D.topInput, D.topKeyDown, D.topKeyUp, D.topSelectionChange] + } + }, + M = null, + x = null, + T = null, + P = null, + I = !1; + C.canUseDOM && (I = N("change") && (!("documentMode" in document) || document.documentMode > 8)); + var S = !1; + C.canUseDOM && (S = N("input") && (!("documentMode" in document) || document.documentMode > 9)); + var k = { + get: function() { + return P.get.call(this) + }, + set: function(e) { + T = "" + e, P.set.call(this, e) + } + }, + A = { + eventTypes: w, + extractEvents: function(e, t, r, o) { + var a, i; + if (n(t) ? I ? a = s : i = u : O(t) ? S ? a = d : (a = h, i = f) : v(t) && (a = m), a) { + var c = a(e, t, r); + if (c) { + var l = _.getPooled(w.change, c, o); + return E.accumulateTwoPhaseDispatches(l), l + } + } + i && i(e, t, r) + } + }; + t.exports = A + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./EventPropagators": 27, + "./ExecutionEnvironment": 28, + "./ReactUpdates": 106, + "./SyntheticEvent": 115, + "./isEventSupported": 158, + "./isTextInputElement": 160, + "./keyOf": 164 + }], + 15: [function(e, t) { + "use strict"; + var n = 0, + r = { + createReactRootIndex: function() { + return n++ + } + }; + t.exports = r + }, {}], + 16: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, n) { + e.insertBefore(t, e.childNodes[n] || null) + } + var o = e("./Danger"), + a = e("./ReactMultiChildUpdateTypes"), + i = e("./setTextContent"), + s = e("./invariant"), + u = { + dangerouslyReplaceNodeWithMarkup: o.dangerouslyReplaceNodeWithMarkup, + updateTextContent: i, + processUpdates: function(e, t) { + for (var u, c = null, l = null, p = 0; p < e.length; p++) + if (u = e[p], u.type === a.MOVE_EXISTING || u.type === a.REMOVE_NODE) { + var d = u.fromIndex, + f = u.parentNode.childNodes[d], + h = u.parentID; + "production" !== n.env.NODE_ENV ? s(f, "processUpdates(): Unable to find child %s of element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a when using tables, nesting tags like
,

, or , or using non-SVG elements in an parent. Try inspecting the child nodes of the element with React ID `%s`.", d, h) : s(f), c = c || {}, c[h] = c[h] || [], c[h][d] = f, l = l || [], l.push(f) + } var v = o.dangerouslyRenderMarkup(t); + if (l) + for (var m = 0; m < l.length; m++) l[m].parentNode.removeChild(l[m]); + for (var y = 0; y < e.length; y++) switch (u = e[y], u.type) { + case a.INSERT_MARKUP: + r(u.parentNode, v[u.markupIndex], u.toIndex); + break; + case a.MOVE_EXISTING: + r(u.parentNode, c[u.parentID][u.fromIndex], u.toIndex); + break; + case a.TEXT_CONTENT: + i(u.parentNode, u.textContent); + break; + case a.REMOVE_NODE: + } + } + }; + t.exports = u + }).call(this, e("_process")) + }, { + "./Danger": 19, + "./ReactMultiChildUpdateTypes": 85, + "./invariant": 157, + "./setTextContent": 172, + _process: 2 + }], + 17: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + return (e & t) === t + } + var o = e("./invariant"), + a = { + MUST_USE_ATTRIBUTE: 1, + MUST_USE_PROPERTY: 2, + HAS_SIDE_EFFECTS: 4, + HAS_BOOLEAN_VALUE: 8, + HAS_NUMERIC_VALUE: 16, + HAS_POSITIVE_NUMERIC_VALUE: 48, + HAS_OVERLOADED_BOOLEAN_VALUE: 64, + injectDOMPropertyConfig: function(e) { + var t = e.Properties || {}, + i = e.DOMAttributeNames || {}, + u = e.DOMPropertyNames || {}, + c = e.DOMMutationMethods || {}; + e.isCustomAttribute && s._isCustomAttributeFunctions.push(e.isCustomAttribute); + for (var l in t) { + "production" !== n.env.NODE_ENV ? o(!s.isStandardName.hasOwnProperty(l), "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.", l) : o(!s.isStandardName.hasOwnProperty(l)), s.isStandardName[l] = !0; + var p = l.toLowerCase(); + if (s.getPossibleStandardName[p] = l, i.hasOwnProperty(l)) { + var d = i[l]; + s.getPossibleStandardName[d] = l, s.getAttributeName[l] = d + } else s.getAttributeName[l] = p; + s.getPropertyName[l] = u.hasOwnProperty(l) ? u[l] : l, s.getMutationMethod[l] = c.hasOwnProperty(l) ? c[l] : null; + var f = t[l]; + s.mustUseAttribute[l] = r(f, a.MUST_USE_ATTRIBUTE), s.mustUseProperty[l] = r(f, a.MUST_USE_PROPERTY), s.hasSideEffects[l] = r(f, a.HAS_SIDE_EFFECTS), s.hasBooleanValue[l] = r(f, a.HAS_BOOLEAN_VALUE), s.hasNumericValue[l] = r(f, a.HAS_NUMERIC_VALUE), s.hasPositiveNumericValue[l] = r(f, a.HAS_POSITIVE_NUMERIC_VALUE), s.hasOverloadedBooleanValue[l] = r(f, a.HAS_OVERLOADED_BOOLEAN_VALUE), "production" !== n.env.NODE_ENV ? o(!s.mustUseAttribute[l] || !s.mustUseProperty[l], "DOMProperty: Cannot require using both attribute and property: %s", l) : o(!s.mustUseAttribute[l] || !s.mustUseProperty[l]), "production" !== n.env.NODE_ENV ? o(s.mustUseProperty[l] || !s.hasSideEffects[l], "DOMProperty: Properties that have side effects must use property: %s", l) : o(s.mustUseProperty[l] || !s.hasSideEffects[l]), "production" !== n.env.NODE_ENV ? o(!!s.hasBooleanValue[l] + !!s.hasNumericValue[l] + !!s.hasOverloadedBooleanValue[l] <= 1, "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s", l) : o(!!s.hasBooleanValue[l] + !!s.hasNumericValue[l] + !!s.hasOverloadedBooleanValue[l] <= 1) + } + } + }, + i = {}, + s = { + ID_ATTRIBUTE_NAME: "data-reactid", + isStandardName: {}, + getPossibleStandardName: {}, + getAttributeName: {}, + getPropertyName: {}, + getMutationMethod: {}, + mustUseAttribute: {}, + mustUseProperty: {}, + hasSideEffects: {}, + hasBooleanValue: {}, + hasNumericValue: {}, + hasPositiveNumericValue: {}, + hasOverloadedBooleanValue: {}, + _isCustomAttributeFunctions: [], + isCustomAttribute: function(e) { + for (var t = 0; t < s._isCustomAttributeFunctions.length; t++) { + var n = s._isCustomAttributeFunctions[t]; + if (n(e)) return !0 + } + return !1 + }, + getDefaultValueForProperty: function(e, t) { + var n, r = i[e]; + return r || (i[e] = r = {}), t in r || (n = document.createElement(e), r[t] = n[t]), r[t] + }, + injection: a + }; + t.exports = s + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 18: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + return null == t || o.hasBooleanValue[e] && !t || o.hasNumericValue[e] && isNaN(t) || o.hasPositiveNumericValue[e] && 1 > t || o.hasOverloadedBooleanValue[e] && t === !1 + } + var o = e("./DOMProperty"), + a = e("./quoteAttributeValueForBrowser"), + i = e("./warning"); + if ("production" !== n.env.NODE_ENV) var s = { + children: !0, + dangerouslySetInnerHTML: !0, + key: !0, + ref: !0 + }, + u = {}, + c = function(e) { + if (!(s.hasOwnProperty(e) && s[e] || u.hasOwnProperty(e) && u[e])) { + u[e] = !0; + var t = e.toLowerCase(), + r = o.isCustomAttribute(t) ? t : o.getPossibleStandardName.hasOwnProperty(t) ? o.getPossibleStandardName[t] : null; + "production" !== n.env.NODE_ENV ? i(null == r, "Unknown DOM property %s. Did you mean %s?", e, r) : null + } + }; + var l = { + createMarkupForID: function(e) { + return o.ID_ATTRIBUTE_NAME + "=" + a(e) + }, + createMarkupForProperty: function(e, t) { + if (o.isStandardName.hasOwnProperty(e) && o.isStandardName[e]) { + if (r(e, t)) return ""; + var i = o.getAttributeName[e]; + return o.hasBooleanValue[e] || o.hasOverloadedBooleanValue[e] && t === !0 ? i : i + "=" + a(t) + } + return o.isCustomAttribute(e) ? null == t ? "" : e + "=" + a(t) : ("production" !== n.env.NODE_ENV && c(e), null) + }, + setValueForProperty: function(e, t, a) { + if (o.isStandardName.hasOwnProperty(t) && o.isStandardName[t]) { + var i = o.getMutationMethod[t]; + if (i) i(e, a); + else if (r(t, a)) this.deleteValueForProperty(e, t); + else if (o.mustUseAttribute[t]) e.setAttribute(o.getAttributeName[t], "" + a); + else { + var s = o.getPropertyName[t]; + o.hasSideEffects[t] && "" + e[s] == "" + a || (e[s] = a) + } + } else o.isCustomAttribute(t) ? null == a ? e.removeAttribute(t) : e.setAttribute(t, "" + a) : "production" !== n.env.NODE_ENV && c(t) + }, + deleteValueForProperty: function(e, t) { + if (o.isStandardName.hasOwnProperty(t) && o.isStandardName[t]) { + var r = o.getMutationMethod[t]; + if (r) r(e, void 0); + else if (o.mustUseAttribute[t]) e.removeAttribute(o.getAttributeName[t]); + else { + var a = o.getPropertyName[t], + i = o.getDefaultValueForProperty(e.nodeName, a); + o.hasSideEffects[t] && "" + e[a] === i || (e[a] = i) + } + } else o.isCustomAttribute(t) ? e.removeAttribute(t) : "production" !== n.env.NODE_ENV && c(t) + } + }; + t.exports = l + }).call(this, e("_process")) + }, { + "./DOMProperty": 17, + "./quoteAttributeValueForBrowser": 170, + "./warning": 178, + _process: 2 + }], + 19: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return e.substring(1, e.indexOf(" ")) + } + var o = e("./ExecutionEnvironment"), + a = e("./createNodesFromMarkup"), + i = e("./emptyFunction"), + s = e("./getMarkupWrap"), + u = e("./invariant"), + c = /^(<[^ \/>]+)/, + l = "data-danger-index", + p = { + dangerouslyRenderMarkup: function(e) { + "production" !== n.env.NODE_ENV ? u(o.canUseDOM, "dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.") : u(o.canUseDOM); + for (var t, p = {}, d = 0; d < e.length; d++) "production" !== n.env.NODE_ENV ? u(e[d], "dangerouslyRenderMarkup(...): Missing markup.") : u(e[d]), t = r(e[d]), t = s(t) ? t : "*", p[t] = p[t] || [], p[t][d] = e[d]; + var f = [], + h = 0; + for (t in p) + if (p.hasOwnProperty(t)) { + var v, m = p[t]; + for (v in m) + if (m.hasOwnProperty(v)) { + var y = m[v]; + m[v] = y.replace(c, "$1 " + l + '="' + v + '" ') + } for (var g = a(m.join(""), i), E = 0; E < g.length; ++E) { + var C = g[E]; + C.hasAttribute && C.hasAttribute(l) ? (v = +C.getAttribute(l), C.removeAttribute(l), "production" !== n.env.NODE_ENV ? u(!f.hasOwnProperty(v), "Danger: Assigning to an already-occupied result index.") : u(!f.hasOwnProperty(v)), f[v] = C, h += 1) : "production" !== n.env.NODE_ENV && console.error("Danger: Discarding unexpected node:", C) + } + } return "production" !== n.env.NODE_ENV ? u(h === f.length, "Danger: Did not assign to every index of resultList.") : u(h === f.length), "production" !== n.env.NODE_ENV ? u(f.length === e.length, "Danger: Expected markup to render %s nodes, but rendered %s.", e.length, f.length) : u(f.length === e.length), f + }, + dangerouslyReplaceNodeWithMarkup: function(e, t) { + "production" !== n.env.NODE_ENV ? u(o.canUseDOM, "dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.") : u(o.canUseDOM), "production" !== n.env.NODE_ENV ? u(t, "dangerouslyReplaceNodeWithMarkup(...): Missing markup.") : u(t), "production" !== n.env.NODE_ENV ? u("html" !== e.tagName.toLowerCase(), "dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See React.renderToString().") : u("html" !== e.tagName.toLowerCase()); + var r = a(t, i)[0]; + e.parentNode.replaceChild(r, e) + } + }; + t.exports = p + }).call(this, e("_process")) + }, { + "./ExecutionEnvironment": 28, + "./createNodesFromMarkup": 133, + "./emptyFunction": 136, + "./getMarkupWrap": 149, + "./invariant": 157, + _process: 2 + }], + 20: [function(e, t) { + "use strict"; + var n = e("./keyOf"), + r = [n({ + ResponderEventPlugin: null + }), n({ + SimpleEventPlugin: null + }), n({ + TapEventPlugin: null + }), n({ + EnterLeaveEventPlugin: null + }), n({ + ChangeEventPlugin: null + }), n({ + SelectEventPlugin: null + }), n({ + BeforeInputEventPlugin: null + }), n({ + AnalyticsEventPlugin: null + }), n({ + MobileSafariClickEventPlugin: null + })]; + t.exports = r + }, { + "./keyOf": 164 + }], + 21: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./EventPropagators"), + o = e("./SyntheticMouseEvent"), + a = e("./ReactMount"), + i = e("./keyOf"), + s = n.topLevelTypes, + u = a.getFirstReactDOM, + c = { + mouseEnter: { + registrationName: i({ + onMouseEnter: null + }), + dependencies: [s.topMouseOut, s.topMouseOver] + }, + mouseLeave: { + registrationName: i({ + onMouseLeave: null + }), + dependencies: [s.topMouseOut, s.topMouseOver] + } + }, + l = [null, null], + p = { + eventTypes: c, + extractEvents: function(e, t, n, i) { + if (e === s.topMouseOver && (i.relatedTarget || i.fromElement)) return null; + if (e !== s.topMouseOut && e !== s.topMouseOver) return null; + var p; + if (t.window === t) p = t; + else { + var d = t.ownerDocument; + p = d ? d.defaultView || d.parentWindow : window + } + var f, h; + if (e === s.topMouseOut ? (f = t, h = u(i.relatedTarget || i.toElement) || p) : (f = p, h = t), f === h) return null; + var v = f ? a.getID(f) : "", + m = h ? a.getID(h) : "", + y = o.getPooled(c.mouseLeave, v, i); + y.type = "mouseleave", y.target = f, y.relatedTarget = h; + var g = o.getPooled(c.mouseEnter, m, i); + return g.type = "mouseenter", g.target = h, g.relatedTarget = f, r.accumulateEnterLeaveDispatches(y, g, v, m), l[0] = y, l[1] = g, l + } + }; + t.exports = p + }, { + "./EventConstants": 22, + "./EventPropagators": 27, + "./ReactMount": 83, + "./SyntheticMouseEvent": 119, + "./keyOf": 164 + }], + 22: [function(e, t) { + "use strict"; + var n = e("./keyMirror"), + r = n({ + bubbled: null, + captured: null + }), + o = n({ + topBlur: null, + topChange: null, + topClick: null, + topCompositionEnd: null, + topCompositionStart: null, + topCompositionUpdate: null, + topContextMenu: null, + topCopy: null, + topCut: null, + topDoubleClick: null, + topDrag: null, + topDragEnd: null, + topDragEnter: null, + topDragExit: null, + topDragLeave: null, + topDragOver: null, + topDragStart: null, + topDrop: null, + topError: null, + topFocus: null, + topInput: null, + topKeyDown: null, + topKeyPress: null, + topKeyUp: null, + topLoad: null, + topMouseDown: null, + topMouseMove: null, + topMouseOut: null, + topMouseOver: null, + topMouseUp: null, + topPaste: null, + topReset: null, + topScroll: null, + topSelectionChange: null, + topSubmit: null, + topTextInput: null, + topTouchCancel: null, + topTouchEnd: null, + topTouchMove: null, + topTouchStart: null, + topWheel: null + }), + a = { + topLevelTypes: o, + PropagationPhases: r + }; + t.exports = a + }, { + "./keyMirror": 163 + }], + 23: [function(e, t) { + (function(n) { + var r = e("./emptyFunction"), + o = { + listen: function(e, t, n) { + return e.addEventListener ? (e.addEventListener(t, n, !1), { + remove: function() { + e.removeEventListener(t, n, !1) + } + }) : e.attachEvent ? (e.attachEvent("on" + t, n), { + remove: function() { + e.detachEvent("on" + t, n) + } + }) : void 0 + }, + capture: function(e, t, o) { + return e.addEventListener ? (e.addEventListener(t, o, !0), { + remove: function() { + e.removeEventListener(t, o, !0) + } + }) : ("production" !== n.env.NODE_ENV && console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."), { + remove: r + }) + }, + registerDefault: function() {} + }; + t.exports = o + }).call(this, e("_process")) + }, { + "./emptyFunction": 136, + _process: 2 + }], + 24: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + var e = d && d.traverseTwoPhase && d.traverseEnterLeave; + "production" !== n.env.NODE_ENV ? u(e, "InstanceHandle not injected before use!") : u(e) + } + var o = e("./EventPluginRegistry"), + a = e("./EventPluginUtils"), + i = e("./accumulateInto"), + s = e("./forEachAccumulated"), + u = e("./invariant"), + c = {}, + l = null, + p = function(e) { + if (e) { + var t = a.executeDispatch, + n = o.getPluginModuleForEvent(e); + n && n.executeDispatch && (t = n.executeDispatch), a.executeDispatchesInOrder(e, t), e.isPersistent() || e.constructor.release(e) + } + }, + d = null, + f = { + injection: { + injectMount: a.injection.injectMount, + injectInstanceHandle: function(e) { + d = e, "production" !== n.env.NODE_ENV && r() + }, + getInstanceHandle: function() { + return "production" !== n.env.NODE_ENV && r(), d + }, + injectEventPluginOrder: o.injectEventPluginOrder, + injectEventPluginsByName: o.injectEventPluginsByName + }, + eventNameDispatchConfigs: o.eventNameDispatchConfigs, + registrationNameModules: o.registrationNameModules, + putListener: function(e, t, r) { + "production" !== n.env.NODE_ENV ? u(!r || "function" == typeof r, "Expected %s listener to be a function, instead got type %s", t, typeof r) : u(!r || "function" == typeof r); + var o = c[t] || (c[t] = {}); + o[e] = r + }, + getListener: function(e, t) { + var n = c[t]; + return n && n[e] + }, + deleteListener: function(e, t) { + var n = c[t]; + n && delete n[e] + }, + deleteAllListeners: function(e) { + for (var t in c) delete c[t][e] + }, + extractEvents: function(e, t, n, r) { + for (var a, s = o.plugins, u = 0, c = s.length; c > u; u++) { + var l = s[u]; + if (l) { + var p = l.extractEvents(e, t, n, r); + p && (a = i(a, p)) + } + } + return a + }, + enqueueEvents: function(e) { + e && (l = i(l, e)) + }, + processEventQueue: function() { + var e = l; + l = null, s(e, p), "production" !== n.env.NODE_ENV ? u(!l, "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.") : u(!l) + }, + __purge: function() { + c = {} + }, + __getListenerBank: function() { + return c + } + }; + t.exports = f + }).call(this, e("_process")) + }, { + "./EventPluginRegistry": 25, + "./EventPluginUtils": 26, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + "./invariant": 157, + _process: 2 + }], + 25: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + if (s) + for (var e in u) { + var t = u[e], + r = s.indexOf(e); + if ("production" !== n.env.NODE_ENV ? i(r > -1, "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.", e) : i(r > -1), !c.plugins[r]) { + "production" !== n.env.NODE_ENV ? i(t.extractEvents, "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.", e) : i(t.extractEvents), c.plugins[r] = t; + var a = t.eventTypes; + for (var l in a) "production" !== n.env.NODE_ENV ? i(o(a[l], t, l), "EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.", l, e) : i(o(a[l], t, l)) + } + } + } + + function o(e, t, r) { + "production" !== n.env.NODE_ENV ? i(!c.eventNameDispatchConfigs.hasOwnProperty(r), "EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.", r) : i(!c.eventNameDispatchConfigs.hasOwnProperty(r)), c.eventNameDispatchConfigs[r] = e; + var o = e.phasedRegistrationNames; + if (o) { + for (var s in o) + if (o.hasOwnProperty(s)) { + var u = o[s]; + a(u, t, r) + } return !0 + } + return e.registrationName ? (a(e.registrationName, t, r), !0) : !1 + } + + function a(e, t, r) { + "production" !== n.env.NODE_ENV ? i(!c.registrationNameModules[e], "EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.", e) : i(!c.registrationNameModules[e]), c.registrationNameModules[e] = t, c.registrationNameDependencies[e] = t.eventTypes[r].dependencies + } + var i = e("./invariant"), + s = null, + u = {}, + c = { + plugins: [], + eventNameDispatchConfigs: {}, + registrationNameModules: {}, + registrationNameDependencies: {}, + injectEventPluginOrder: function(e) { + "production" !== n.env.NODE_ENV ? i(!s, "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.") : i(!s), s = Array.prototype.slice.call(e), r() + }, + injectEventPluginsByName: function(e) { + var t = !1; + for (var o in e) + if (e.hasOwnProperty(o)) { + var a = e[o]; + u.hasOwnProperty(o) && u[o] === a || ("production" !== n.env.NODE_ENV ? i(!u[o], "EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.", o) : i(!u[o]), u[o] = a, t = !0) + } t && r() + }, + getPluginModuleForEvent: function(e) { + var t = e.dispatchConfig; + if (t.registrationName) return c.registrationNameModules[t.registrationName] || null; + for (var n in t.phasedRegistrationNames) + if (t.phasedRegistrationNames.hasOwnProperty(n)) { + var r = c.registrationNameModules[t.phasedRegistrationNames[n]]; + if (r) return r + } return null + }, + _resetEventPlugins: function() { + s = null; + for (var e in u) u.hasOwnProperty(e) && delete u[e]; + c.plugins.length = 0; + var t = c.eventNameDispatchConfigs; + for (var n in t) t.hasOwnProperty(n) && delete t[n]; + var r = c.registrationNameModules; + for (var o in r) r.hasOwnProperty(o) && delete r[o] + } + }; + t.exports = c + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 26: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return e === y.topMouseUp || e === y.topTouchEnd || e === y.topTouchCancel + } + + function o(e) { + return e === y.topMouseMove || e === y.topTouchMove + } + + function a(e) { + return e === y.topMouseDown || e === y.topTouchStart + } + + function i(e, t) { + var r = e._dispatchListeners, + o = e._dispatchIDs; + if ("production" !== n.env.NODE_ENV && f(e), Array.isArray(r)) + for (var a = 0; a < r.length && !e.isPropagationStopped(); a++) t(e, r[a], o[a]); + else r && t(e, r, o) + } + + function s(e, t, n) { + e.currentTarget = m.Mount.getNode(n); + var r = t(e, n); + return e.currentTarget = null, r + } + + function u(e, t) { + i(e, t), e._dispatchListeners = null, e._dispatchIDs = null + } + + function c(e) { + var t = e._dispatchListeners, + r = e._dispatchIDs; + if ("production" !== n.env.NODE_ENV && f(e), Array.isArray(t)) { + for (var o = 0; o < t.length && !e.isPropagationStopped(); o++) + if (t[o](e, r[o])) return r[o] + } else if (t && t(e, r)) return r; + return null + } + + function l(e) { + var t = c(e); + return e._dispatchIDs = null, e._dispatchListeners = null, t + } + + function p(e) { + "production" !== n.env.NODE_ENV && f(e); + var t = e._dispatchListeners, + r = e._dispatchIDs; + "production" !== n.env.NODE_ENV ? v(!Array.isArray(t), "executeDirectDispatch(...): Invalid `event`.") : v(!Array.isArray(t)); + var o = t ? t(e, r) : null; + return e._dispatchListeners = null, e._dispatchIDs = null, o + } + + function d(e) { + return !!e._dispatchListeners + } + var f, h = e("./EventConstants"), + v = e("./invariant"), + m = { + Mount: null, + injectMount: function(e) { + m.Mount = e, "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? v(e && e.getNode, "EventPluginUtils.injection.injectMount(...): Injected Mount module is missing getNode.") : v(e && e.getNode)) + } + }, + y = h.topLevelTypes; + "production" !== n.env.NODE_ENV && (f = function(e) { + var t = e._dispatchListeners, + r = e._dispatchIDs, + o = Array.isArray(t), + a = Array.isArray(r), + i = a ? r.length : r ? 1 : 0, + s = o ? t.length : t ? 1 : 0; + "production" !== n.env.NODE_ENV ? v(a === o && i === s, "EventPluginUtils: Invalid `event`.") : v(a === o && i === s) + }); + var g = { + isEndish: r, + isMoveish: o, + isStartish: a, + executeDirectDispatch: p, + executeDispatch: s, + executeDispatchesInOrder: u, + executeDispatchesInOrderStopAtTrue: l, + hasDispatches: d, + injection: m, + useTouchEvents: !1 + }; + t.exports = g + }).call(this, e("_process")) + }, { + "./EventConstants": 22, + "./invariant": 157, + _process: 2 + }], + 27: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, n) { + var r = t.dispatchConfig.phasedRegistrationNames[n]; + return m(e, r) + } + + function o(e, t, o) { + if ("production" !== n.env.NODE_ENV && !e) throw new Error("Dispatching id must not be null"); + var a = t ? v.bubbled : v.captured, + i = r(e, o, a); + i && (o._dispatchListeners = f(o._dispatchListeners, i), o._dispatchIDs = f(o._dispatchIDs, e)) + } + + function a(e) { + e && e.dispatchConfig.phasedRegistrationNames && d.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker, o, e) + } + + function i(e, t, n) { + if (n && n.dispatchConfig.registrationName) { + var r = n.dispatchConfig.registrationName, + o = m(e, r); + o && (n._dispatchListeners = f(n._dispatchListeners, o), n._dispatchIDs = f(n._dispatchIDs, e)) + } + } + + function s(e) { + e && e.dispatchConfig.registrationName && i(e.dispatchMarker, null, e) + } + + function u(e) { + h(e, a) + } + + function c(e, t, n, r) { + d.injection.getInstanceHandle().traverseEnterLeave(n, r, i, e, t) + } + + function l(e) { + h(e, s) + } + var p = e("./EventConstants"), + d = e("./EventPluginHub"), + f = e("./accumulateInto"), + h = e("./forEachAccumulated"), + v = p.PropagationPhases, + m = d.getListener, + y = { + accumulateTwoPhaseDispatches: u, + accumulateDirectDispatches: l, + accumulateEnterLeaveDispatches: c + }; + t.exports = y + }).call(this, e("_process")) + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + _process: 2 + }], + 28: [function(e, t) { + "use strict"; + var n = !("undefined" == typeof window || !window.document || !window.document.createElement), + r = { + canUseDOM: n, + canUseWorkers: "undefined" != typeof Worker, + canUseEventListeners: n && !(!window.addEventListener && !window.attachEvent), + canUseViewport: n && !!window.screen, + isInWorker: !n + }; + t.exports = r + }, {}], + 29: [function(e, t) { + "use strict"; + + function n(e) { + this._root = e, this._startText = this.getText(), this._fallbackText = null + } + var r = e("./PooledClass"), + o = e("./Object.assign"), + a = e("./getTextContentAccessor"); + o(n.prototype, { + getText: function() { + return "value" in this._root ? this._root.value : this._root[a()] + }, + getData: function() { + if (this._fallbackText) return this._fallbackText; + var e, t, n = this._startText, + r = n.length, + o = this.getText(), + a = o.length; + for (e = 0; r > e && n[e] === o[e]; e++); + var i = r - e; + for (t = 1; i >= t && n[r - t] === o[a - t]; t++); + var s = t > 1 ? 1 - t : void 0; + return this._fallbackText = o.slice(e, s), this._fallbackText + } + }), r.addPoolingTo(n), t.exports = n + }, { + "./Object.assign": 35, + "./PooledClass": 36, + "./getTextContentAccessor": 152 + }], + 30: [function(e, t) { + "use strict"; + var n, r = e("./DOMProperty"), + o = e("./ExecutionEnvironment"), + a = r.injection.MUST_USE_ATTRIBUTE, + i = r.injection.MUST_USE_PROPERTY, + s = r.injection.HAS_BOOLEAN_VALUE, + u = r.injection.HAS_SIDE_EFFECTS, + c = r.injection.HAS_NUMERIC_VALUE, + l = r.injection.HAS_POSITIVE_NUMERIC_VALUE, + p = r.injection.HAS_OVERLOADED_BOOLEAN_VALUE; + if (o.canUseDOM) { + var d = document.implementation; + n = d && d.hasFeature && d.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") + } + var f = { + isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/), + Properties: { + accept: null, + acceptCharset: null, + accessKey: null, + action: null, + allowFullScreen: a | s, + allowTransparency: a, + alt: null, + async: s, + autoComplete: null, + autoPlay: s, + cellPadding: null, + cellSpacing: null, + charSet: a, + checked: i | s, + classID: a, + className: n ? a : i, + cols: a | l, + colSpan: null, + content: null, + contentEditable: null, + contextMenu: a, + controls: i | s, + coords: null, + crossOrigin: null, + data: null, + dateTime: a, + defer: s, + dir: null, + disabled: a | s, + download: p, + draggable: null, + encType: null, + form: a, + formAction: a, + formEncType: a, + formMethod: a, + formNoValidate: s, + formTarget: a, + frameBorder: a, + headers: null, + height: a, + hidden: a | s, + href: null, + hrefLang: null, + htmlFor: null, + httpEquiv: null, + icon: null, + id: i, + label: null, + lang: null, + list: a, + loop: i | s, + manifest: a, + marginHeight: null, + marginWidth: null, + max: null, + maxLength: a, + media: a, + mediaGroup: null, + method: null, + min: null, + multiple: i | s, + muted: i | s, + name: null, + noValidate: s, + open: s, + pattern: null, + placeholder: null, + poster: null, + preload: null, + radioGroup: null, + readOnly: i | s, + rel: null, + required: s, + role: a, + rows: a | l, + rowSpan: null, + sandbox: null, + scope: null, + scrolling: null, + seamless: a | s, + selected: i | s, + shape: null, + size: a | l, + sizes: a, + span: l, + spellCheck: null, + src: null, + srcDoc: i, + srcSet: a, + start: c, + step: null, + style: null, + tabIndex: null, + target: null, + title: null, + type: null, + useMap: null, + value: i | u, + width: a, + wmode: a, + autoCapitalize: null, + autoCorrect: null, + itemProp: a, + itemScope: a | s, + itemType: a, + itemID: a, + itemRef: a, + property: null + }, + DOMAttributeNames: { + acceptCharset: "accept-charset", + className: "class", + htmlFor: "for", + httpEquiv: "http-equiv" + }, + DOMPropertyNames: { + autoCapitalize: "autocapitalize", + autoComplete: "autocomplete", + autoCorrect: "autocorrect", + autoFocus: "autofocus", + autoPlay: "autoplay", + encType: "encoding", + hrefLang: "hreflang", + radioGroup: "radiogroup", + spellCheck: "spellcheck", + srcDoc: "srcdoc", + srcSet: "srcset" + } + }; + t.exports = f + }, { + "./DOMProperty": 17, + "./ExecutionEnvironment": 28 + }], + 31: [function(e, t) { + "use strict"; + var n = e("./ReactLink"), + r = e("./ReactStateSetters"), + o = { + linkState: function(e) { + return new n(this.state[e], r.createStateKeySetter(this, e)) + } + }; + t.exports = o + }, { + "./ReactLink": 81, + "./ReactStateSetters": 100 + }], + 32: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + "production" !== n.env.NODE_ENV ? c(null == e.props.checkedLink || null == e.props.valueLink, "Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa.") : c(null == e.props.checkedLink || null == e.props.valueLink) + } + + function o(e) { + r(e), "production" !== n.env.NODE_ENV ? c(null == e.props.value && null == e.props.onChange, "Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink.") : c(null == e.props.value && null == e.props.onChange) + } + + function a(e) { + r(e), "production" !== n.env.NODE_ENV ? c(null == e.props.checked && null == e.props.onChange, "Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink") : c(null == e.props.checked && null == e.props.onChange) + } + + function i(e) { + this.props.valueLink.requestChange(e.target.value) + } + + function s(e) { + this.props.checkedLink.requestChange(e.target.checked) + } + var u = e("./ReactPropTypes"), + c = e("./invariant"), + l = { + button: !0, + checkbox: !0, + image: !0, + hidden: !0, + radio: !0, + reset: !0, + submit: !0 + }, + p = { + Mixin: { + propTypes: { + value: function(e, t) { + return !e[t] || l[e.type] || e.onChange || e.readOnly || e.disabled ? null : new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.") + }, + checked: function(e, t) { + return !e[t] || e.onChange || e.readOnly || e.disabled ? null : new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.") + }, + onChange: u.func + } + }, + getValue: function(e) { + return e.props.valueLink ? (o(e), e.props.valueLink.value) : e.props.value + }, + getChecked: function(e) { + return e.props.checkedLink ? (a(e), e.props.checkedLink.value) : e.props.checked + }, + getOnChange: function(e) { + return e.props.valueLink ? (o(e), i) : e.props.checkedLink ? (a(e), s) : e.props.onChange + } + }; + t.exports = p + }).call(this, e("_process")) + }, { + "./ReactPropTypes": 92, + "./invariant": 157, + _process: 2 + }], + 33: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + e.remove() + } + var o = e("./ReactBrowserEventEmitter"), + a = e("./accumulateInto"), + i = e("./forEachAccumulated"), + s = e("./invariant"), + u = { + trapBubbledEvent: function(e, t) { + "production" !== n.env.NODE_ENV ? s(this.isMounted(), "Must be mounted to trap events") : s(this.isMounted()); + var r = this.getDOMNode(); + "production" !== n.env.NODE_ENV ? s(r, "LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.") : s(r); + var i = o.trapBubbledEvent(e, t, r); + this._localEventListeners = a(this._localEventListeners, i) + }, + componentWillUnmount: function() { + this._localEventListeners && i(this._localEventListeners, r) + } + }; + t.exports = u + }).call(this, e("_process")) + }, { + "./ReactBrowserEventEmitter": 39, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + "./invariant": 157, + _process: 2 + }], + 34: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./emptyFunction"), + o = n.topLevelTypes, + a = { + eventTypes: null, + extractEvents: function(e, t, n, a) { + if (e === o.topTouchStart) { + var i = a.target; + i && !i.onclick && (i.onclick = r) + } + } + }; + t.exports = a + }, { + "./EventConstants": 22, + "./emptyFunction": 136 + }], + 35: [function(e, t) { + "use strict"; + + function n(e) { + if (null == e) throw new TypeError("Object.assign target cannot be null or undefined"); + for (var t = Object(e), n = Object.prototype.hasOwnProperty, r = 1; r < arguments.length; r++) { + var o = arguments[r]; + if (null != o) { + var a = Object(o); + for (var i in a) n.call(a, i) && (t[i] = a[i]) + } + } + return t + } + t.exports = n + }, {}], + 36: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./invariant"), + o = function(e) { + var t = this; + if (t.instancePool.length) { + var n = t.instancePool.pop(); + return t.call(n, e), n + } + return new t(e) + }, + a = function(e, t) { + var n = this; + if (n.instancePool.length) { + var r = n.instancePool.pop(); + return n.call(r, e, t), r + } + return new n(e, t) + }, + i = function(e, t, n) { + var r = this; + if (r.instancePool.length) { + var o = r.instancePool.pop(); + return r.call(o, e, t, n), o + } + return new r(e, t, n) + }, + s = function(e, t, n, r, o) { + var a = this; + if (a.instancePool.length) { + var i = a.instancePool.pop(); + return a.call(i, e, t, n, r, o), i + } + return new a(e, t, n, r, o) + }, + u = function(e) { + var t = this; + "production" !== n.env.NODE_ENV ? r(e instanceof t, "Trying to release an instance into a pool of a different type.") : r(e instanceof t), e.destructor && e.destructor(), t.instancePool.length < t.poolSize && t.instancePool.push(e) + }, + c = 10, + l = o, + p = function(e, t) { + var n = e; + return n.instancePool = [], n.getPooled = t || l, n.poolSize || (n.poolSize = c), n.release = u, n + }, + d = { + addPoolingTo: p, + oneArgumentPooler: o, + twoArgumentPooler: a, + threeArgumentPooler: i, + fiveArgumentPooler: s + }; + t.exports = d + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 37: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./EventPluginUtils"), + o = e("./ReactChildren"), + a = e("./ReactComponent"), + i = e("./ReactClass"), + s = e("./ReactContext"), + u = e("./ReactCurrentOwner"), + c = e("./ReactElement"), + l = e("./ReactElementValidator"), + p = e("./ReactDOM"), + d = e("./ReactDOMTextComponent"), + f = e("./ReactDefaultInjection"), + h = e("./ReactInstanceHandles"), + v = e("./ReactMount"), + m = e("./ReactPerf"), + y = e("./ReactPropTypes"), + g = e("./ReactReconciler"), + E = e("./ReactServerRendering"), + C = e("./Object.assign"), + b = e("./findDOMNode"), + _ = e("./onlyChild"); + f.inject(); + var N = c.createElement, + O = c.createFactory, + R = c.cloneElement; + "production" !== n.env.NODE_ENV && (N = l.createElement, O = l.createFactory, R = l.cloneElement); + var D = m.measure("React", "render", v.render), + w = { + Children: { + map: o.map, + forEach: o.forEach, + count: o.count, + only: _ + }, + Component: a, + DOM: p, + PropTypes: y, + initializeTouchEvents: function(e) { + r.useTouchEvents = e + }, + createClass: i.createClass, + createElement: N, + cloneElement: R, + createFactory: O, + createMixin: function(e) { + return e + }, + constructAndRenderComponent: v.constructAndRenderComponent, + constructAndRenderComponentByID: v.constructAndRenderComponentByID, + findDOMNode: b, + render: D, + renderToString: E.renderToString, + renderToStaticMarkup: E.renderToStaticMarkup, + unmountComponentAtNode: v.unmountComponentAtNode, + isValidElement: c.isValidElement, + withContext: s.withContext, + __spread: C + }; + if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject && __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ + CurrentOwner: u, + InstanceHandles: h, + Mount: v, + Reconciler: g, + TextComponent: d + }), "production" !== n.env.NODE_ENV) { + var M = e("./ExecutionEnvironment"); + if (M.canUseDOM && window.top === window.self) { + navigator.userAgent.indexOf("Chrome") > -1 && "undefined" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && console.debug("Download the React DevTools for a better development experience: http://fb.me/react-devtools"); + for (var x = [Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim, Object.create, Object.freeze], T = 0; T < x.length; T++) + if (!x[T]) { + console.error("One or more ES5 shim/shams expected by React are not available: http://fb.me/react-warning-polyfills"); + break + } + } + } + w.version = "0.13.1", t.exports = w + }).call(this, e("_process")) + }, { + "./EventPluginUtils": 26, + "./ExecutionEnvironment": 28, + "./Object.assign": 35, + "./ReactChildren": 43, + "./ReactClass": 44, + "./ReactComponent": 45, + "./ReactContext": 50, + "./ReactCurrentOwner": 51, + "./ReactDOM": 52, + "./ReactDOMTextComponent": 63, + "./ReactDefaultInjection": 66, + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./ReactInstanceHandles": 78, + "./ReactMount": 83, + "./ReactPerf": 88, + "./ReactPropTypes": 92, + "./ReactReconciler": 95, + "./ReactServerRendering": 98, + "./findDOMNode": 139, + "./onlyChild": 167, + _process: 2 + }], + 38: [function(e, t) { + "use strict"; + var n = e("./findDOMNode"), + r = { + getDOMNode: function() { + return n(this) + } + }; + t.exports = r + }, { + "./findDOMNode": 139 + }], + 39: [function(e, t) { + "use strict"; + + function n(e) { + return Object.prototype.hasOwnProperty.call(e, h) || (e[h] = d++, l[e[h]] = {}), l[e[h]] + } + var r = e("./EventConstants"), + o = e("./EventPluginHub"), + a = e("./EventPluginRegistry"), + i = e("./ReactEventEmitterMixin"), + s = e("./ViewportMetrics"), + u = e("./Object.assign"), + c = e("./isEventSupported"), + l = {}, + p = !1, + d = 0, + f = { + topBlur: "blur", + topChange: "change", + topClick: "click", + topCompositionEnd: "compositionend", + topCompositionStart: "compositionstart", + topCompositionUpdate: "compositionupdate", + topContextMenu: "contextmenu", + topCopy: "copy", + topCut: "cut", + topDoubleClick: "dblclick", + topDrag: "drag", + topDragEnd: "dragend", + topDragEnter: "dragenter", + topDragExit: "dragexit", + topDragLeave: "dragleave", + topDragOver: "dragover", + topDragStart: "dragstart", + topDrop: "drop", + topFocus: "focus", + topInput: "input", + topKeyDown: "keydown", + topKeyPress: "keypress", + topKeyUp: "keyup", + topMouseDown: "mousedown", + topMouseMove: "mousemove", + topMouseOut: "mouseout", + topMouseOver: "mouseover", + topMouseUp: "mouseup", + topPaste: "paste", + topScroll: "scroll", + topSelectionChange: "selectionchange", + topTextInput: "textInput", + topTouchCancel: "touchcancel", + topTouchEnd: "touchend", + topTouchMove: "touchmove", + topTouchStart: "touchstart", + topWheel: "wheel" + }, + h = "_reactListenersID" + String(Math.random()).slice(2), + v = u({}, i, { + ReactEventListener: null, + injection: { + injectReactEventListener: function(e) { + e.setHandleTopLevel(v.handleTopLevel), v.ReactEventListener = e + } + }, + setEnabled: function(e) { + v.ReactEventListener && v.ReactEventListener.setEnabled(e) + }, + isEnabled: function() { + return !(!v.ReactEventListener || !v.ReactEventListener.isEnabled()) + }, + listenTo: function(e, t) { + for (var o = t, i = n(o), s = a.registrationNameDependencies[e], u = r.topLevelTypes, l = 0, p = s.length; p > l; l++) { + var d = s[l]; + i.hasOwnProperty(d) && i[d] || (d === u.topWheel ? c("wheel") ? v.ReactEventListener.trapBubbledEvent(u.topWheel, "wheel", o) : c("mousewheel") ? v.ReactEventListener.trapBubbledEvent(u.topWheel, "mousewheel", o) : v.ReactEventListener.trapBubbledEvent(u.topWheel, "DOMMouseScroll", o) : d === u.topScroll ? c("scroll", !0) ? v.ReactEventListener.trapCapturedEvent(u.topScroll, "scroll", o) : v.ReactEventListener.trapBubbledEvent(u.topScroll, "scroll", v.ReactEventListener.WINDOW_HANDLE) : d === u.topFocus || d === u.topBlur ? (c("focus", !0) ? (v.ReactEventListener.trapCapturedEvent(u.topFocus, "focus", o), v.ReactEventListener.trapCapturedEvent(u.topBlur, "blur", o)) : c("focusin") && (v.ReactEventListener.trapBubbledEvent(u.topFocus, "focusin", o), v.ReactEventListener.trapBubbledEvent(u.topBlur, "focusout", o)), i[u.topBlur] = !0, i[u.topFocus] = !0) : f.hasOwnProperty(d) && v.ReactEventListener.trapBubbledEvent(d, f[d], o), i[d] = !0) + } + }, + trapBubbledEvent: function(e, t, n) { + return v.ReactEventListener.trapBubbledEvent(e, t, n) + }, + trapCapturedEvent: function(e, t, n) { + return v.ReactEventListener.trapCapturedEvent(e, t, n) + }, + ensureScrollValueMonitoring: function() { + if (!p) { + var e = s.refreshScrollValues; + v.ReactEventListener.monitorScrollValue(e), p = !0 + } + }, + eventNameDispatchConfigs: o.eventNameDispatchConfigs, + registrationNameModules: o.registrationNameModules, + putListener: o.putListener, + getListener: o.getListener, + deleteListener: o.deleteListener, + deleteAllListeners: o.deleteAllListeners + }); + t.exports = v + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./EventPluginRegistry": 25, + "./Object.assign": 35, + "./ReactEventEmitterMixin": 73, + "./ViewportMetrics": 124, + "./isEventSupported": 158 + }], + 40: [function(e, t) { + "use strict"; + var n = e("./React"), + r = e("./Object.assign"), + o = n.createFactory(e("./ReactTransitionGroup")), + a = n.createFactory(e("./ReactCSSTransitionGroupChild")), + i = n.createClass({ + displayName: "ReactCSSTransitionGroup", + propTypes: { + transitionName: n.PropTypes.string.isRequired, + transitionAppear: n.PropTypes.bool, + transitionEnter: n.PropTypes.bool, + transitionLeave: n.PropTypes.bool + }, + getDefaultProps: function() { + return { + transitionAppear: !1, + transitionEnter: !0, + transitionLeave: !0 + } + }, + _wrapChild: function(e) { + return a({ + name: this.props.transitionName, + appear: this.props.transitionAppear, + enter: this.props.transitionEnter, + leave: this.props.transitionLeave + }, e) + }, + render: function() { + return o(r({}, this.props, { + childFactory: this._wrapChild + })) + } + }); + t.exports = i + }, { + "./Object.assign": 35, + "./React": 37, + "./ReactCSSTransitionGroupChild": 41, + "./ReactTransitionGroup": 104 + }], + 41: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./React"), + o = e("./CSSCore"), + a = e("./ReactTransitionEvents"), + i = e("./onlyChild"), + s = e("./warning"), + u = 17, + c = 5e3, + l = null; + "production" !== n.env.NODE_ENV && (l = function() { + "production" !== n.env.NODE_ENV ? s(!1, "transition(): tried to perform an animation without an animationend or transitionend event after timeout (%sms). You should either disable this transition in JS or add a CSS animation/transition.", c) : null + }); + var p = r.createClass({ + displayName: "ReactCSSTransitionGroupChild", + transition: function(e, t) { + var r = this.getDOMNode(), + i = this.props.name + "-" + e, + s = i + "-active", + u = null, + p = function(e) { + e && e.target !== r || ("production" !== n.env.NODE_ENV && clearTimeout(u), o.removeClass(r, i), o.removeClass(r, s), a.removeEndEventListener(r, p), t && t()) + }; + a.addEndEventListener(r, p), o.addClass(r, i), this.queueClass(s), "production" !== n.env.NODE_ENV && (u = setTimeout(l, c)) + }, + queueClass: function(e) { + this.classNameQueue.push(e), this.timeout || (this.timeout = setTimeout(this.flushClassNameQueue, u)) + }, + flushClassNameQueue: function() { + this.isMounted() && this.classNameQueue.forEach(o.addClass.bind(o, this.getDOMNode())), this.classNameQueue.length = 0, this.timeout = null + }, + componentWillMount: function() { + this.classNameQueue = [] + }, + componentWillUnmount: function() { + this.timeout && clearTimeout(this.timeout) + }, + componentWillAppear: function(e) { + this.props.appear ? this.transition("appear", e) : e() + }, + componentWillEnter: function(e) { + this.props.enter ? this.transition("enter", e) : e() + }, + componentWillLeave: function(e) { + this.props.leave ? this.transition("leave", e) : e() + }, + render: function() { + return i(this.props.children) + } + }); + t.exports = p + }).call(this, e("_process")) + }, { + "./CSSCore": 10, + "./React": 37, + "./ReactTransitionEvents": 103, + "./onlyChild": 167, + "./warning": 178, + _process: 2 + }], + 42: [function(e, t) { + "use strict"; + var n = e("./ReactReconciler"), + r = e("./flattenChildren"), + o = e("./instantiateReactComponent"), + a = e("./shouldUpdateReactComponent"), + i = { + instantiateChildren: function(e) { + var t = r(e); + for (var n in t) + if (t.hasOwnProperty(n)) { + var a = t[n], + i = o(a, null); + t[n] = i + } return t + }, + updateChildren: function(e, t, i, s) { + var u = r(t); + if (!u && !e) return null; + var c; + for (c in u) + if (u.hasOwnProperty(c)) { + var l = e && e[c], + p = l && l._currentElement, + d = u[c]; + if (a(p, d)) n.receiveComponent(l, d, i, s), u[c] = l; + else { + l && n.unmountComponent(l, c); + var f = o(d, null); + u[c] = f + } + } for (c in e) !e.hasOwnProperty(c) || u && u.hasOwnProperty(c) || n.unmountComponent(e[c]); + return u + }, + unmountChildren: function(e) { + for (var t in e) { + var r = e[t]; + n.unmountComponent(r) + } + } + }; + t.exports = i + }, { + "./ReactReconciler": 95, + "./flattenChildren": 140, + "./instantiateReactComponent": 156, + "./shouldUpdateReactComponent": 174 + }], + 43: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + this.forEachFunction = e, this.forEachContext = t + } + + function o(e, t, n, r) { + var o = e; + o.forEachFunction.call(o.forEachContext, t, r) + } + + function a(e, t, n) { + if (null == e) return e; + var a = r.getPooled(t, n); + f(e, o, a), r.release(a) + } + + function i(e, t, n) { + this.mapResult = e, this.mapFunction = t, this.mapContext = n + } + + function s(e, t, r, o) { + var a = e, + i = a.mapResult, + s = !i.hasOwnProperty(r); + if ("production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? h(s, "ReactChildren.map(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.", r) : null), s) { + var u = a.mapFunction.call(a.mapContext, t, o); + i[r] = u + } + } + + function u(e, t, n) { + if (null == e) return e; + var r = {}, + o = i.getPooled(r, t, n); + return f(e, s, o), i.release(o), d.create(r) + } + + function c() { + return null + } + + function l(e) { + return f(e, c, null) + } + var p = e("./PooledClass"), + d = e("./ReactFragment"), + f = e("./traverseAllChildren"), + h = e("./warning"), + v = p.twoArgumentPooler, + m = p.threeArgumentPooler; + p.addPoolingTo(r, v), p.addPoolingTo(i, m); + var y = { + forEach: a, + map: u, + count: l + }; + t.exports = y + }).call(this, e("_process")) + }, { + "./PooledClass": 36, + "./ReactFragment": 75, + "./traverseAllChildren": 176, + "./warning": 178, + _process: 2 + }], + 44: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, r) { + for (var o in t) t.hasOwnProperty(o) && ("production" !== n.env.NODE_ENV ? R("function" == typeof t[o], "%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.", e.displayName || "ReactClass", E[r], o) : null) + } + + function o(e, t) { + var r = x.hasOwnProperty(t) ? x[t] : null; + I.hasOwnProperty(t) && ("production" !== n.env.NODE_ENV ? _(r === w.OVERRIDE_BASE, "ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.", t) : _(r === w.OVERRIDE_BASE)), e.hasOwnProperty(t) && ("production" !== n.env.NODE_ENV ? _(r === w.DEFINE_MANY || r === w.DEFINE_MANY_MERGED, "ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.", t) : _(r === w.DEFINE_MANY || r === w.DEFINE_MANY_MERGED)) + } + + function a(e, t) { + if (t) { + "production" !== n.env.NODE_ENV ? _("function" != typeof t, "ReactClass: You're attempting to use a component class as a mixin. Instead, just use a regular object.") : _("function" != typeof t), "production" !== n.env.NODE_ENV ? _(!h.isValidElement(t), "ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.") : _(!h.isValidElement(t)); + var r = e.prototype; + t.hasOwnProperty(D) && T.mixins(e, t.mixins); + for (var a in t) + if (t.hasOwnProperty(a) && a !== D) { + var i = t[a]; + if (o(r, a), T.hasOwnProperty(a)) T[a](e, i); + else { + var s = x.hasOwnProperty(a), + l = r.hasOwnProperty(a), + p = i && i.__reactDontBind, + d = "function" == typeof i, + f = d && !s && !l && !p; + if (f) r.__reactAutoBindMap || (r.__reactAutoBindMap = {}), r.__reactAutoBindMap[a] = i, r[a] = i; + else if (l) { + var v = x[a]; + "production" !== n.env.NODE_ENV ? _(s && (v === w.DEFINE_MANY_MERGED || v === w.DEFINE_MANY), "ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.", v, a) : _(s && (v === w.DEFINE_MANY_MERGED || v === w.DEFINE_MANY)), v === w.DEFINE_MANY_MERGED ? r[a] = u(r[a], i) : v === w.DEFINE_MANY && (r[a] = c(r[a], i)) + } else r[a] = i, "production" !== n.env.NODE_ENV && "function" == typeof i && t.displayName && (r[a].displayName = t.displayName + "_" + a) + } + } + } + } + + function i(e, t) { + if (t) + for (var r in t) { + var o = t[r]; + if (t.hasOwnProperty(r)) { + var a = r in T; + "production" !== n.env.NODE_ENV ? _(!a, 'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.', r) : _(!a); + var i = r in e; + "production" !== n.env.NODE_ENV ? _(!i, "ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.", r) : _(!i), e[r] = o + } + } + } + + function s(e, t) { + "production" !== n.env.NODE_ENV ? _(e && t && "object" == typeof e && "object" == typeof t, "mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.") : _(e && t && "object" == typeof e && "object" == typeof t); + for (var r in t) t.hasOwnProperty(r) && ("production" !== n.env.NODE_ENV ? _(void 0 === e[r], "mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.", r) : _(void 0 === e[r]), e[r] = t[r]); + return e + } + + function u(e, t) { + return function() { + var n = e.apply(this, arguments), + r = t.apply(this, arguments); + if (null == n) return r; + if (null == r) return n; + var o = {}; + return s(o, n), s(o, r), o + } + } + + function c(e, t) { + return function() { + e.apply(this, arguments), t.apply(this, arguments) + } + } + + function l(e, t) { + var r = t.bind(e); + if ("production" !== n.env.NODE_ENV) { + r.__reactBoundContext = e, r.__reactBoundMethod = t, r.__reactBoundArguments = null; + var o = e.constructor.displayName, + a = r.bind; + r.bind = function(i) { + for (var s = [], u = 1, c = arguments.length; c > u; u++) s.push(arguments[u]); + if (i !== e && null !== i) "production" !== n.env.NODE_ENV ? R(!1, "bind(): React component methods may only be bound to the component instance. See %s", o) : null; + else if (!s.length) return "production" !== n.env.NODE_ENV ? R(!1, "bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s", o) : null, r; + var l = a.apply(r, arguments); + return l.__reactBoundContext = e, l.__reactBoundMethod = t, l.__reactBoundArguments = s, l + } + } + return r + } + + function p(e) { + for (var t in e.__reactAutoBindMap) + if (e.__reactAutoBindMap.hasOwnProperty(t)) { + var n = e.__reactAutoBindMap[t]; + e[t] = l(e, v.guard(n, e.constructor.displayName + "." + t)) + } + } + var d = e("./ReactComponent"), + f = e("./ReactCurrentOwner"), + h = e("./ReactElement"), + v = e("./ReactErrorUtils"), + m = e("./ReactInstanceMap"), + y = e("./ReactLifeCycle"), + g = e("./ReactPropTypeLocations"), + E = e("./ReactPropTypeLocationNames"), + C = e("./ReactUpdateQueue"), + b = e("./Object.assign"), + _ = e("./invariant"), + N = e("./keyMirror"), + O = e("./keyOf"), + R = e("./warning"), + D = O({ + mixins: null + }), + w = N({ + DEFINE_ONCE: null, + DEFINE_MANY: null, + OVERRIDE_BASE: null, + DEFINE_MANY_MERGED: null + }), + M = [], + x = { + mixins: w.DEFINE_MANY, + statics: w.DEFINE_MANY, + propTypes: w.DEFINE_MANY, + contextTypes: w.DEFINE_MANY, + childContextTypes: w.DEFINE_MANY, + getDefaultProps: w.DEFINE_MANY_MERGED, + getInitialState: w.DEFINE_MANY_MERGED, + getChildContext: w.DEFINE_MANY_MERGED, + render: w.DEFINE_ONCE, + componentWillMount: w.DEFINE_MANY, + componentDidMount: w.DEFINE_MANY, + componentWillReceiveProps: w.DEFINE_MANY, + shouldComponentUpdate: w.DEFINE_ONCE, + componentWillUpdate: w.DEFINE_MANY, + componentDidUpdate: w.DEFINE_MANY, + componentWillUnmount: w.DEFINE_MANY, + updateComponent: w.OVERRIDE_BASE + }, + T = { + displayName: function(e, t) { + e.displayName = t + }, + mixins: function(e, t) { + if (t) + for (var n = 0; n < t.length; n++) a(e, t[n]) + }, + childContextTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.childContext), e.childContextTypes = b({}, e.childContextTypes, t) + }, + contextTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.context), e.contextTypes = b({}, e.contextTypes, t) + }, + getDefaultProps: function(e, t) { + e.getDefaultProps = e.getDefaultProps ? u(e.getDefaultProps, t) : t; + + }, + propTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.prop), e.propTypes = b({}, e.propTypes, t) + }, + statics: function(e, t) { + i(e, t) + } + }, + P = { + enumerable: !1, + get: function() { + var e = this.displayName || this.name || "Component"; + return "production" !== n.env.NODE_ENV ? R(!1, "%s.type is deprecated. Use %s directly to access the class.", e, e) : null, Object.defineProperty(this, "type", { + value: this + }), this + } + }, + I = { + replaceState: function(e, t) { + C.enqueueReplaceState(this, e), t && C.enqueueCallback(this, t) + }, + isMounted: function() { + if ("production" !== n.env.NODE_ENV) { + var e = f.current; + null !== e && ("production" !== n.env.NODE_ENV ? R(e._warnedAboutRefsInRender, "%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", e.getName() || "A component") : null, e._warnedAboutRefsInRender = !0) + } + var t = m.get(this); + return t && t !== y.currentlyMountingInstance + }, + setProps: function(e, t) { + C.enqueueSetProps(this, e), t && C.enqueueCallback(this, t) + }, + replaceProps: function(e, t) { + C.enqueueReplaceProps(this, e), t && C.enqueueCallback(this, t) + } + }, + S = function() {}; + b(S.prototype, d.prototype, I); + var k = { + createClass: function(e) { + var t = function(e, r) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? R(this instanceof t, "Something is calling a React component directly. Use a factory or JSX instead. See: http://fb.me/react-legacyfactory") : null), this.__reactAutoBindMap && p(this), this.props = e, this.context = r, this.state = null; + var o = this.getInitialState ? this.getInitialState() : null; + "production" !== n.env.NODE_ENV && "undefined" == typeof o && this.getInitialState._isMockFunction && (o = null), "production" !== n.env.NODE_ENV ? _("object" == typeof o && !Array.isArray(o), "%s.getInitialState(): must return an object or null", t.displayName || "ReactCompositeComponent") : _("object" == typeof o && !Array.isArray(o)), this.state = o + }; + t.prototype = new S, t.prototype.constructor = t, M.forEach(a.bind(null, t)), a(t, e), t.getDefaultProps && (t.defaultProps = t.getDefaultProps()), "production" !== n.env.NODE_ENV && (t.getDefaultProps && (t.getDefaultProps.isReactClassApproved = {}), t.prototype.getInitialState && (t.prototype.getInitialState.isReactClassApproved = {})), "production" !== n.env.NODE_ENV ? _(t.prototype.render, "createClass(...): Class specification must implement a `render` method.") : _(t.prototype.render), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? R(!t.prototype.componentShouldUpdate, "%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", e.displayName || "A component") : null); + for (var r in x) t.prototype[r] || (t.prototype[r] = null); + if (t.type = t, "production" !== n.env.NODE_ENV) try { + Object.defineProperty(t, "type", P) + } catch (o) {} + return t + }, + injection: { + injectMixin: function(e) { + M.push(e) + } + } + }; + t.exports = k + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./ReactComponent": 45, + "./ReactCurrentOwner": 51, + "./ReactElement": 69, + "./ReactErrorUtils": 72, + "./ReactInstanceMap": 79, + "./ReactLifeCycle": 80, + "./ReactPropTypeLocationNames": 90, + "./ReactPropTypeLocations": 91, + "./ReactUpdateQueue": 105, + "./invariant": 157, + "./keyMirror": 163, + "./keyOf": 164, + "./warning": 178, + _process: 2 + }], + 45: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + this.props = e, this.context = t + } + var o = e("./ReactUpdateQueue"), + a = e("./invariant"), + i = e("./warning"); + if (r.prototype.setState = function(e, t) { + "production" !== n.env.NODE_ENV ? a("object" == typeof e || "function" == typeof e || null == e, "setState(...): takes an object of state variables to update or a function which returns an object of state variables.") : a("object" == typeof e || "function" == typeof e || null == e), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? i(null != e, "setState(...): You passed an undefined or null state object; instead, use forceUpdate().") : null), o.enqueueSetState(this, e), t && o.enqueueCallback(this, t) + }, r.prototype.forceUpdate = function(e) { + o.enqueueForceUpdate(this), e && o.enqueueCallback(this, e) + }, "production" !== n.env.NODE_ENV) { + var s = { + getDOMNode: "getDOMNode", + isMounted: "isMounted", + replaceProps: "replaceProps", + replaceState: "replaceState", + setProps: "setProps" + }, + u = function(e, t) { + try { + Object.defineProperty(r.prototype, e, { + get: function() { + return void("production" !== n.env.NODE_ENV ? i(!1, "%s(...) is deprecated in plain JavaScript React classes.", t) : null) + } + }) + } catch (o) {} + }; + for (var c in s) s.hasOwnProperty(c) && u(c, s[c]) + } + t.exports = r + }).call(this, e("_process")) + }, { + "./ReactUpdateQueue": 105, + "./invariant": 157, + "./warning": 178, + _process: 2 + }], + 46: [function(e, t) { + "use strict"; + var n = e("./ReactDOMIDOperations"), + r = e("./ReactMount"), + o = { + processChildrenUpdates: n.dangerouslyProcessChildrenUpdates, + replaceNodeWithMarkupByID: n.dangerouslyReplaceNodeWithMarkupByID, + unmountIDFromEnvironment: function(e) { + r.purgeID(e) + } + }; + t.exports = o + }, { + "./ReactDOMIDOperations": 56, + "./ReactMount": 83 + }], + 47: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./invariant"), + o = !1, + a = { + unmountIDFromEnvironment: null, + replaceNodeWithMarkupByID: null, + processChildrenUpdates: null, + injection: { + injectEnvironment: function(e) { + "production" !== n.env.NODE_ENV ? r(!o, "ReactCompositeComponent: injectEnvironment() can only be called once.") : r(!o), a.unmountIDFromEnvironment = e.unmountIDFromEnvironment, a.replaceNodeWithMarkupByID = e.replaceNodeWithMarkupByID, a.processChildrenUpdates = e.processChildrenUpdates, o = !0 + } + } + }; + t.exports = a + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 48: [function(e, t) { + "use strict"; + var n = e("./shallowEqual"), + r = { + shouldComponentUpdate: function(e, t) { + return !n(this.props, e) || !n(this.state, t) + } + }; + t.exports = r + }, { + "./shallowEqual": 173 + }], + 49: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + var t = e._currentElement._owner || null; + if (t) { + var n = t.getName(); + if (n) return " Check the render method of `" + n + "`." + } + return "" + } + var o = e("./ReactComponentEnvironment"), + a = e("./ReactContext"), + i = e("./ReactCurrentOwner"), + s = e("./ReactElement"), + u = e("./ReactElementValidator"), + c = e("./ReactInstanceMap"), + l = e("./ReactLifeCycle"), + p = e("./ReactNativeComponent"), + d = e("./ReactPerf"), + f = e("./ReactPropTypeLocations"), + h = e("./ReactPropTypeLocationNames"), + v = e("./ReactReconciler"), + m = e("./ReactUpdates"), + y = e("./Object.assign"), + g = e("./emptyObject"), + E = e("./invariant"), + C = e("./shouldUpdateReactComponent"), + b = e("./warning"), + _ = 1, + N = { + construct: function(e) { + this._currentElement = e, this._rootNodeID = null, this._instance = null, this._pendingElement = null, this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1, this._renderedComponent = null, this._context = null, this._mountOrder = 0, this._isTopLevel = !1, this._pendingCallbacks = null + }, + mountComponent: function(e, t, r) { + this._context = r, this._mountOrder = _++, this._rootNodeID = e; + var o = this._processProps(this._currentElement.props), + a = this._processContext(this._currentElement._context), + i = p.getComponentClassForElement(this._currentElement), + s = new i(o, a); + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b(null != s.render, "%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render` in your component or you may have accidentally tried to render an element whose type is a function that isn't a React component.", i.displayName || i.name || "Component") : null), s.props = o, s.context = a, s.refs = g, this._instance = s, c.set(s, this), "production" !== n.env.NODE_ENV && this._warnIfContextsDiffer(this._currentElement._context, r), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b(!s.getInitialState || s.getInitialState.isReactClassApproved, "getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b(!s.propTypes, "propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b(!s.contextTypes, "contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b("function" != typeof s.componentShouldUpdate, "%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", this.getName() || "A component") : null); + var u = s.state; + void 0 === u && (s.state = u = null), "production" !== n.env.NODE_ENV ? E("object" == typeof u && !Array.isArray(u), "%s.state: must be set to an object or null", this.getName() || "ReactCompositeComponent") : E("object" == typeof u && !Array.isArray(u)), this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1; + var d, f = l.currentlyMountingInstance; + l.currentlyMountingInstance = this; + try { + s.componentWillMount && (s.componentWillMount(), this._pendingStateQueue && (s.state = this._processPendingState(s.props, s.context))), d = this._renderValidatedComponent() + } finally { + l.currentlyMountingInstance = f + } + this._renderedComponent = this._instantiateReactComponent(d, this._currentElement.type); + var h = v.mountComponent(this._renderedComponent, e, t, this._processChildContext(r)); + return s.componentDidMount && t.getReactMountReady().enqueue(s.componentDidMount, s), h + }, + unmountComponent: function() { + var e = this._instance; + if (e.componentWillUnmount) { + var t = l.currentlyUnmountingInstance; + l.currentlyUnmountingInstance = this; + try { + e.componentWillUnmount() + } finally { + l.currentlyUnmountingInstance = t + } + } + v.unmountComponent(this._renderedComponent), this._renderedComponent = null, this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1, this._pendingCallbacks = null, this._pendingElement = null, this._context = null, this._rootNodeID = null, c.remove(e) + }, + _setPropsInternal: function(e, t) { + var n = this._pendingElement || this._currentElement; + this._pendingElement = s.cloneAndReplaceProps(n, y({}, n.props, e)), m.enqueueUpdate(this, t) + }, + _maskContext: function(e) { + var t = null; + if ("string" == typeof this._currentElement.type) return g; + var n = this._currentElement.type.contextTypes; + if (!n) return g; + t = {}; + for (var r in n) t[r] = e[r]; + return t + }, + _processContext: function(e) { + var t = this._maskContext(e); + if ("production" !== n.env.NODE_ENV) { + var r = p.getComponentClassForElement(this._currentElement); + r.contextTypes && this._checkPropTypes(r.contextTypes, t, f.context) + } + return t + }, + _processChildContext: function(e) { + var t = this._instance, + r = t.getChildContext && t.getChildContext(); + if (r) { + "production" !== n.env.NODE_ENV ? E("object" == typeof t.constructor.childContextTypes, "%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", this.getName() || "ReactCompositeComponent") : E("object" == typeof t.constructor.childContextTypes), "production" !== n.env.NODE_ENV && this._checkPropTypes(t.constructor.childContextTypes, r, f.childContext); + for (var o in r) "production" !== n.env.NODE_ENV ? E(o in t.constructor.childContextTypes, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || "ReactCompositeComponent", o) : E(o in t.constructor.childContextTypes); + return y({}, e, r) + } + return e + }, + _processProps: function(e) { + if ("production" !== n.env.NODE_ENV) { + var t = p.getComponentClassForElement(this._currentElement); + t.propTypes && this._checkPropTypes(t.propTypes, e, f.prop) + } + return e + }, + _checkPropTypes: function(e, t, o) { + var a = this.getName(); + for (var i in e) + if (e.hasOwnProperty(i)) { + var s; + try { + "production" !== n.env.NODE_ENV ? E("function" == typeof e[i], "%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.", a || "React class", h[o], i) : E("function" == typeof e[i]), s = e[i](t, i, a, o) + } catch (u) { + s = u + } + if (s instanceof Error) { + var c = r(this); + o === f.prop ? "production" !== n.env.NODE_ENV ? b(!1, "Failed Composite propType: %s%s", s.message, c) : null : "production" !== n.env.NODE_ENV ? b(!1, "Failed Context Types: %s%s", s.message, c) : null + } + } + }, + receiveComponent: function(e, t, n) { + var r = this._currentElement, + o = this._context; + this._pendingElement = null, this.updateComponent(t, r, e, o, n) + }, + performUpdateIfNecessary: function(e) { + null != this._pendingElement && v.receiveComponent(this, this._pendingElement || this._currentElement, e, this._context), (null !== this._pendingStateQueue || this._pendingForceUpdate) && ("production" !== n.env.NODE_ENV && u.checkAndWarnForMutatedProps(this._currentElement), this.updateComponent(e, this._currentElement, this._currentElement, this._context, this._context)) + }, + _warnIfContextsDiffer: function(e, t) { + e = this._maskContext(e), t = this._maskContext(t); + for (var r = Object.keys(t).sort(), o = this.getName() || "ReactCompositeComponent", a = 0; a < r.length; a++) { + var i = r[a]; + "production" !== n.env.NODE_ENV ? b(e[i] === t[i], "owner-based and parent-based contexts differ (values: `%s` vs `%s`) for key (%s) while mounting %s (see: http://fb.me/react-context-by-parent)", e[i], t[i], i, o) : null + } + }, + updateComponent: function(e, t, r, o, a) { + var i = this._instance, + s = i.context, + u = i.props; + t !== r && (s = this._processContext(r._context), u = this._processProps(r.props), "production" !== n.env.NODE_ENV && null != a && this._warnIfContextsDiffer(r._context, a), i.componentWillReceiveProps && i.componentWillReceiveProps(u, s)); + var c = this._processPendingState(u, s), + l = this._pendingForceUpdate || !i.shouldComponentUpdate || i.shouldComponentUpdate(u, c, s); + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b("undefined" != typeof l, "%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", this.getName() || "ReactCompositeComponent") : null), l ? (this._pendingForceUpdate = !1, this._performComponentUpdate(r, u, c, s, e, a)) : (this._currentElement = r, this._context = a, i.props = u, i.state = c, i.context = s) + }, + _processPendingState: function(e, t) { + var n = this._instance, + r = this._pendingStateQueue, + o = this._pendingReplaceState; + if (this._pendingReplaceState = !1, this._pendingStateQueue = null, !r) return n.state; + for (var a = y({}, o ? r[0] : n.state), i = o ? 1 : 0; i < r.length; i++) { + var s = r[i]; + y(a, "function" == typeof s ? s.call(n, a, e, t) : s) + } + return a + }, + _performComponentUpdate: function(e, t, n, r, o, a) { + var i = this._instance, + s = i.props, + u = i.state, + c = i.context; + i.componentWillUpdate && i.componentWillUpdate(t, n, r), this._currentElement = e, this._context = a, i.props = t, i.state = n, i.context = r, this._updateRenderedComponent(o, a), i.componentDidUpdate && o.getReactMountReady().enqueue(i.componentDidUpdate.bind(i, s, u, c), i) + }, + _updateRenderedComponent: function(e, t) { + var n = this._renderedComponent, + r = n._currentElement, + o = this._renderValidatedComponent(); + if (C(r, o)) v.receiveComponent(n, o, e, this._processChildContext(t)); + else { + var a = this._rootNodeID, + i = n._rootNodeID; + v.unmountComponent(n), this._renderedComponent = this._instantiateReactComponent(o, this._currentElement.type); + var s = v.mountComponent(this._renderedComponent, a, e, t); + this._replaceNodeWithMarkupByID(i, s) + } + }, + _replaceNodeWithMarkupByID: function(e, t) { + o.replaceNodeWithMarkupByID(e, t) + }, + _renderValidatedComponentWithoutOwnerOrContext: function() { + var e = this._instance, + t = e.render(); + return "production" !== n.env.NODE_ENV && "undefined" == typeof t && e.render._isMockFunction && (t = null), t + }, + _renderValidatedComponent: function() { + var e, t = a.current; + a.current = this._processChildContext(this._currentElement._context), i.current = this; + try { + e = this._renderValidatedComponentWithoutOwnerOrContext() + } finally { + a.current = t, i.current = null + } + return "production" !== n.env.NODE_ENV ? E(null === e || e === !1 || s.isValidElement(e), "%s.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.", this.getName() || "ReactCompositeComponent") : E(null === e || e === !1 || s.isValidElement(e)), e + }, + attachRef: function(e, t) { + var n = this.getPublicInstance(), + r = n.refs === g ? n.refs = {} : n.refs; + r[e] = t.getPublicInstance() + }, + detachRef: function(e) { + var t = this.getPublicInstance().refs; + delete t[e] + }, + getName: function() { + var e = this._currentElement.type, + t = this._instance && this._instance.constructor; + return e.displayName || t && t.displayName || e.name || t && t.name || null + }, + getPublicInstance: function() { + return this._instance + }, + _instantiateReactComponent: null + }; + d.measureMethods(N, "ReactCompositeComponent", { + mountComponent: "mountComponent", + updateComponent: "updateComponent", + _renderValidatedComponent: "_renderValidatedComponent" + }); + var O = { + Mixin: N + }; + t.exports = O + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./ReactComponentEnvironment": 47, + "./ReactContext": 50, + "./ReactCurrentOwner": 51, + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./ReactInstanceMap": 79, + "./ReactLifeCycle": 80, + "./ReactNativeComponent": 86, + "./ReactPerf": 88, + "./ReactPropTypeLocationNames": 90, + "./ReactPropTypeLocations": 91, + "./ReactReconciler": 95, + "./ReactUpdates": 106, + "./emptyObject": 137, + "./invariant": 157, + "./shouldUpdateReactComponent": 174, + "./warning": 178, + _process: 2 + }], + 50: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./Object.assign"), + o = e("./emptyObject"), + a = e("./warning"), + i = !1, + s = { + current: o, + withContext: function(e, t) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? a(i, "withContext is deprecated and will be removed in a future version. Use a wrapper component with getChildContext instead.") : null, i = !0); + var o, u = s.current; + s.current = r({}, u, e); + try { + o = t() + } finally { + s.current = u + } + return o + } + }; + t.exports = s + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./emptyObject": 137, + "./warning": 178, + _process: 2 + }], + 51: [function(e, t) { + "use strict"; + var n = { + current: null + }; + t.exports = n + }, {}], + 52: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return "production" !== n.env.NODE_ENV ? a.createFactory(e) : o.createFactory(e) + } + var o = e("./ReactElement"), + a = e("./ReactElementValidator"), + i = e("./mapObject"), + s = i({ + a: "a", + abbr: "abbr", + address: "address", + area: "area", + article: "article", + aside: "aside", + audio: "audio", + b: "b", + base: "base", + bdi: "bdi", + bdo: "bdo", + big: "big", + blockquote: "blockquote", + body: "body", + br: "br", + button: "button", + canvas: "canvas", + caption: "caption", + cite: "cite", + code: "code", + col: "col", + colgroup: "colgroup", + data: "data", + datalist: "datalist", + dd: "dd", + del: "del", + details: "details", + dfn: "dfn", + dialog: "dialog", + div: "div", + dl: "dl", + dt: "dt", + em: "em", + embed: "embed", + fieldset: "fieldset", + figcaption: "figcaption", + figure: "figure", + footer: "footer", + form: "form", + h1: "h1", + h2: "h2", + h3: "h3", + h4: "h4", + h5: "h5", + h6: "h6", + head: "head", + header: "header", + hr: "hr", + html: "html", + i: "i", + iframe: "iframe", + img: "img", + input: "input", + ins: "ins", + kbd: "kbd", + keygen: "keygen", + label: "label", + legend: "legend", + li: "li", + link: "link", + main: "main", + map: "map", + mark: "mark", + menu: "menu", + menuitem: "menuitem", + meta: "meta", + meter: "meter", + nav: "nav", + noscript: "noscript", + object: "object", + ol: "ol", + optgroup: "optgroup", + option: "option", + output: "output", + p: "p", + param: "param", + picture: "picture", + pre: "pre", + progress: "progress", + q: "q", + rp: "rp", + rt: "rt", + ruby: "ruby", + s: "s", + samp: "samp", + script: "script", + section: "section", + select: "select", + small: "small", + source: "source", + span: "span", + strong: "strong", + style: "style", + sub: "sub", + summary: "summary", + sup: "sup", + table: "table", + tbody: "tbody", + td: "td", + textarea: "textarea", + tfoot: "tfoot", + th: "th", + thead: "thead", + time: "time", + title: "title", + tr: "tr", + track: "track", + u: "u", + ul: "ul", + "var": "var", + video: "video", + wbr: "wbr", + circle: "circle", + defs: "defs", + ellipse: "ellipse", + g: "g", + line: "line", + linearGradient: "linearGradient", + mask: "mask", + path: "path", + pattern: "pattern", + polygon: "polygon", + polyline: "polyline", + radialGradient: "radialGradient", + rect: "rect", + stop: "stop", + svg: "svg", + text: "text", + tspan: "tspan" + }, r); + t.exports = s + }).call(this, e("_process")) + }, { + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./mapObject": 165, + _process: 2 + }], + 53: [function(e, t) { + "use strict"; + var n = e("./AutoFocusMixin"), + r = e("./ReactBrowserComponentMixin"), + o = e("./ReactClass"), + a = e("./ReactElement"), + i = e("./keyMirror"), + s = a.createFactory("button"), + u = i({ + onClick: !0, + onDoubleClick: !0, + onMouseDown: !0, + onMouseMove: !0, + onMouseUp: !0, + onClickCapture: !0, + onDoubleClickCapture: !0, + onMouseDownCapture: !0, + onMouseMoveCapture: !0, + onMouseUpCapture: !0 + }), + c = o.createClass({ + displayName: "ReactDOMButton", + tagName: "BUTTON", + mixins: [n, r], + render: function() { + var e = {}; + for (var t in this.props) !this.props.hasOwnProperty(t) || this.props.disabled && u[t] || (e[t] = this.props[t]); + return s(e, this.props.children) + } + }); + t.exports = c + }, { + "./AutoFocusMixin": 8, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69, + "./keyMirror": 163 + }], + 54: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + e && (null != e.dangerouslySetInnerHTML && ("production" !== n.env.NODE_ENV ? y(null == e.children, "Can only set one of `children` or `props.dangerouslySetInnerHTML`.") : y(null == e.children), "production" !== n.env.NODE_ENV ? y(null != e.dangerouslySetInnerHTML.__html, "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit http://fb.me/react-invariant-dangerously-set-inner-html for more information.") : y(null != e.dangerouslySetInnerHTML.__html)), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? C(null == e.innerHTML, "Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`.") : null, "production" !== n.env.NODE_ENV ? C(!e.contentEditable || null == e.children, "A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.") : null), "production" !== n.env.NODE_ENV ? y(null == e.style || "object" == typeof e.style, "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.") : y(null == e.style || "object" == typeof e.style)) + } + + function o(e, t, r, o) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? C("onScroll" !== t || g("scroll", !0), "This browser doesn't support the `onScroll` event") : null); + var a = d.findReactContainerForID(e); + if (a) { + var i = a.nodeType === D ? a.ownerDocument : a; + _(t, i) + } + o.getPutListenerQueue().enqueuePutListener(e, t, r) + } + + function a(e) { + P.call(T, e) || ("production" !== n.env.NODE_ENV ? y(x.test(e), "Invalid tag: %s", e) : y(x.test(e)), T[e] = !0) + } + + function i(e) { + a(e), this._tag = e, this._renderedChildren = null, this._previousStyleCopy = null, this._rootNodeID = null + } + var s = e("./CSSPropertyOperations"), + u = e("./DOMProperty"), + c = e("./DOMPropertyOperations"), + l = e("./ReactBrowserEventEmitter"), + p = e("./ReactComponentBrowserEnvironment"), + d = e("./ReactMount"), + f = e("./ReactMultiChild"), + h = e("./ReactPerf"), + v = e("./Object.assign"), + m = e("./escapeTextContentForBrowser"), + y = e("./invariant"), + g = e("./isEventSupported"), + E = e("./keyOf"), + C = e("./warning"), + b = l.deleteListener, + _ = l.listenTo, + N = l.registrationNameModules, + O = { + string: !0, + number: !0 + }, + R = E({ + style: null + }), + D = 1, + w = null, + M = { + area: !0, + base: !0, + br: !0, + col: !0, + embed: !0, + hr: !0, + img: !0, + input: !0, + keygen: !0, + link: !0, + meta: !0, + param: !0, + source: !0, + track: !0, + wbr: !0 + }, + x = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/, + T = {}, + P = {}.hasOwnProperty; + i.displayName = "ReactDOMComponent", i.Mixin = { + construct: function(e) { + this._currentElement = e + }, + mountComponent: function(e, t, n) { + this._rootNodeID = e, r(this._currentElement.props); + var o = M[this._tag] ? "" : ""; + return this._createOpenTagMarkupAndPutListeners(t) + this._createContentMarkup(t, n) + o + }, + _createOpenTagMarkupAndPutListeners: function(e) { + var t = this._currentElement.props, + n = "<" + this._tag; + for (var r in t) + if (t.hasOwnProperty(r)) { + var a = t[r]; + if (null != a) + if (N.hasOwnProperty(r)) o(this._rootNodeID, r, a, e); + else { + r === R && (a && (a = this._previousStyleCopy = v({}, t.style)), a = s.createMarkupForStyles(a)); + var i = c.createMarkupForProperty(r, a); + i && (n += " " + i) + } + } if (e.renderToStaticMarkup) return n + ">"; + var u = c.createMarkupForID(this._rootNodeID); + return n + " " + u + ">" + }, + _createContentMarkup: function(e, t) { + var n = ""; + ("listing" === this._tag || "pre" === this._tag || "textarea" === this._tag) && (n = "\n"); + var r = this._currentElement.props, + o = r.dangerouslySetInnerHTML; + if (null != o) { + if (null != o.__html) return n + o.__html + } else { + var a = O[typeof r.children] ? r.children : null, + i = null != a ? null : r.children; + if (null != a) return n + m(a); + if (null != i) { + var s = this.mountChildren(i, e, t); + return n + s.join("") + } + } + return n + }, + receiveComponent: function(e, t, n) { + var r = this._currentElement; + this._currentElement = e, this.updateComponent(t, r, e, n) + }, + updateComponent: function(e, t, n, o) { + r(this._currentElement.props), this._updateDOMProperties(t.props, e), this._updateDOMChildren(t.props, e, o) + }, + _updateDOMProperties: function(e, t) { + var n, r, a, i = this._currentElement.props; + for (n in e) + if (!i.hasOwnProperty(n) && e.hasOwnProperty(n)) + if (n === R) { + var s = this._previousStyleCopy; + for (r in s) s.hasOwnProperty(r) && (a = a || {}, a[r] = ""); + this._previousStyleCopy = null + } else N.hasOwnProperty(n) ? b(this._rootNodeID, n) : (u.isStandardName[n] || u.isCustomAttribute(n)) && w.deletePropertyByID(this._rootNodeID, n); + for (n in i) { + var c = i[n], + l = n === R ? this._previousStyleCopy : e[n]; + if (i.hasOwnProperty(n) && c !== l) + if (n === R) + if (c && (c = this._previousStyleCopy = v({}, c)), l) { + for (r in l) !l.hasOwnProperty(r) || c && c.hasOwnProperty(r) || (a = a || {}, a[r] = ""); + for (r in c) c.hasOwnProperty(r) && l[r] !== c[r] && (a = a || {}, a[r] = c[r]) + } else a = c; + else N.hasOwnProperty(n) ? o(this._rootNodeID, n, c, t) : (u.isStandardName[n] || u.isCustomAttribute(n)) && w.updatePropertyByID(this._rootNodeID, n, c) + } + a && w.updateStylesByID(this._rootNodeID, a) + }, + _updateDOMChildren: function(e, t, n) { + var r = this._currentElement.props, + o = O[typeof e.children] ? e.children : null, + a = O[typeof r.children] ? r.children : null, + i = e.dangerouslySetInnerHTML && e.dangerouslySetInnerHTML.__html, + s = r.dangerouslySetInnerHTML && r.dangerouslySetInnerHTML.__html, + u = null != o ? null : e.children, + c = null != a ? null : r.children, + l = null != o || null != i, + p = null != a || null != s; + null != u && null == c ? this.updateChildren(null, t, n) : l && !p && this.updateTextContent(""), null != a ? o !== a && this.updateTextContent("" + a) : null != s ? i !== s && w.updateInnerHTMLByID(this._rootNodeID, s) : null != c && this.updateChildren(c, t, n) + }, + unmountComponent: function() { + this.unmountChildren(), l.deleteAllListeners(this._rootNodeID), p.unmountIDFromEnvironment(this._rootNodeID), this._rootNodeID = null + } + }, h.measureMethods(i, "ReactDOMComponent", { + mountComponent: "mountComponent", + updateComponent: "updateComponent" + }), v(i.prototype, i.Mixin, f.Mixin), i.injection = { + injectIDOperations: function(e) { + i.BackendIDOperations = w = e + } + }, t.exports = i + }).call(this, e("_process")) + }, { + "./CSSPropertyOperations": 12, + "./DOMProperty": 17, + "./DOMPropertyOperations": 18, + "./Object.assign": 35, + "./ReactBrowserEventEmitter": 39, + "./ReactComponentBrowserEnvironment": 46, + "./ReactMount": 83, + "./ReactMultiChild": 84, + "./ReactPerf": 88, + "./escapeTextContentForBrowser": 138, + "./invariant": 157, + "./isEventSupported": 158, + "./keyOf": 164, + "./warning": 178, + _process: 2 + }], + 55: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("form"), + u = a.createClass({ + displayName: "ReactDOMForm", + tagName: "FORM", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topReset, "reset"), this.trapBubbledEvent(n.topLevelTypes.topSubmit, "submit") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 56: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./CSSPropertyOperations"), + o = e("./DOMChildrenOperations"), + a = e("./DOMPropertyOperations"), + i = e("./ReactMount"), + s = e("./ReactPerf"), + u = e("./invariant"), + c = e("./setInnerHTML"), + l = { + dangerouslySetInnerHTML: "`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.", + style: "`style` must be set using `updateStylesByID()`." + }, + p = { + updatePropertyByID: function(e, t, r) { + var o = i.getNode(e); + "production" !== n.env.NODE_ENV ? u(!l.hasOwnProperty(t), "updatePropertyByID(...): %s", l[t]) : u(!l.hasOwnProperty(t)), null != r ? a.setValueForProperty(o, t, r) : a.deleteValueForProperty(o, t) + }, + deletePropertyByID: function(e, t, r) { + var o = i.getNode(e); + "production" !== n.env.NODE_ENV ? u(!l.hasOwnProperty(t), "updatePropertyByID(...): %s", l[t]) : u(!l.hasOwnProperty(t)), a.deleteValueForProperty(o, t, r) + }, + updateStylesByID: function(e, t) { + var n = i.getNode(e); + r.setValueForStyles(n, t) + }, + updateInnerHTMLByID: function(e, t) { + var n = i.getNode(e); + c(n, t) + }, + updateTextContentByID: function(e, t) { + var n = i.getNode(e); + o.updateTextContent(n, t) + }, + dangerouslyReplaceNodeWithMarkupByID: function(e, t) { + var n = i.getNode(e); + o.dangerouslyReplaceNodeWithMarkup(n, t) + }, + dangerouslyProcessChildrenUpdates: function(e, t) { + for (var n = 0; n < e.length; n++) e[n].parentNode = i.getNode(e[n].parentID); + o.processUpdates(e, t) + } + }; + s.measureMethods(p, "ReactDOMIDOperations", { + updatePropertyByID: "updatePropertyByID", + deletePropertyByID: "deletePropertyByID", + updateStylesByID: "updateStylesByID", + updateInnerHTMLByID: "updateInnerHTMLByID", + updateTextContentByID: "updateTextContentByID", + dangerouslyReplaceNodeWithMarkupByID: "dangerouslyReplaceNodeWithMarkupByID", + dangerouslyProcessChildrenUpdates: "dangerouslyProcessChildrenUpdates" + }), t.exports = p + }).call(this, e("_process")) + }, { + "./CSSPropertyOperations": 12, + "./DOMChildrenOperations": 16, + "./DOMPropertyOperations": 18, + "./ReactMount": 83, + "./ReactPerf": 88, + "./invariant": 157, + "./setInnerHTML": 171, + _process: 2 + }], + 57: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("iframe"), + u = a.createClass({ + displayName: "ReactDOMIframe", + tagName: "IFRAME", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topLoad, "load") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 58: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("img"), + u = a.createClass({ + displayName: "ReactDOMImg", + tagName: "IMG", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topLoad, "load"), this.trapBubbledEvent(n.topLevelTypes.topError, "error") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 59: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this.isMounted() && this.forceUpdate() + } + var o = e("./AutoFocusMixin"), + a = e("./DOMPropertyOperations"), + i = e("./LinkedValueUtils"), + s = e("./ReactBrowserComponentMixin"), + u = e("./ReactClass"), + c = e("./ReactElement"), + l = e("./ReactMount"), + p = e("./ReactUpdates"), + d = e("./Object.assign"), + f = e("./invariant"), + h = c.createFactory("input"), + v = {}, + m = u.createClass({ + displayName: "ReactDOMInput", + tagName: "INPUT", + mixins: [o, i.Mixin, s], + getInitialState: function() { + var e = this.props.defaultValue; + return { + initialChecked: this.props.defaultChecked || !1, + initialValue: null != e ? e : null + } + }, + render: function() { + var e = d({}, this.props); + e.defaultChecked = null, e.defaultValue = null; + var t = i.getValue(this); + e.value = null != t ? t : this.state.initialValue; + var n = i.getChecked(this); + return e.checked = null != n ? n : this.state.initialChecked, e.onChange = this._handleChange, h(e, this.props.children) + }, + componentDidMount: function() { + var e = l.getID(this.getDOMNode()); + v[e] = this + }, + componentWillUnmount: function() { + var e = this.getDOMNode(), + t = l.getID(e); + delete v[t] + }, + componentDidUpdate: function() { + var e = this.getDOMNode(); + null != this.props.checked && a.setValueForProperty(e, "checked", this.props.checked || !1); + var t = i.getValue(this); + null != t && a.setValueForProperty(e, "value", "" + t) + }, + _handleChange: function(e) { + var t, o = i.getOnChange(this); + o && (t = o.call(this, e)), p.asap(r, this); + var a = this.props.name; + if ("radio" === this.props.type && null != a) { + for (var s = this.getDOMNode(), u = s; u.parentNode;) u = u.parentNode; + for (var c = u.querySelectorAll("input[name=" + JSON.stringify("" + a) + '][type="radio"]'), d = 0, h = c.length; h > d; d++) { + var m = c[d]; + if (m !== s && m.form === s.form) { + var y = l.getID(m); + "production" !== n.env.NODE_ENV ? f(y, "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.") : f(y); + var g = v[y]; + "production" !== n.env.NODE_ENV ? f(g, "ReactDOMInput: Unknown radio button ID %s.", y) : f(g), p.asap(r, g) + } + } + } + return t + } + }); + t.exports = m + }).call(this, e("_process")) + }, { + "./AutoFocusMixin": 8, + "./DOMPropertyOperations": 18, + "./LinkedValueUtils": 32, + "./Object.assign": 35, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69, + "./ReactMount": 83, + "./ReactUpdates": 106, + "./invariant": 157, + _process: 2 + }], + 60: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./ReactBrowserComponentMixin"), + o = e("./ReactClass"), + a = e("./ReactElement"), + i = e("./warning"), + s = a.createFactory("option"), + u = o.createClass({ + displayName: "ReactDOMOption", + tagName: "OPTION", + mixins: [r], + componentWillMount: function() { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? i(null == this.props.selected, "Use the `defaultValue` or `value` props on " + r + "" + }, + receiveComponent: function(e) { + if (e !== this._currentElement) { + this._currentElement = e; + var t = "" + e; + t !== this._stringText && (this._stringText = t, o.BackendIDOperations.updateTextContentByID(this._rootNodeID, t)) + } + }, + unmountComponent: function() { + r.unmountIDFromEnvironment(this._rootNodeID) + } + }), t.exports = s + }, { + "./DOMPropertyOperations": 18, + "./Object.assign": 35, + "./ReactComponentBrowserEnvironment": 46, + "./ReactDOMComponent": 54, + "./escapeTextContentForBrowser": 138 + }], + 64: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this.isMounted() && this.forceUpdate() + } + var o = e("./AutoFocusMixin"), + a = e("./DOMPropertyOperations"), + i = e("./LinkedValueUtils"), + s = e("./ReactBrowserComponentMixin"), + u = e("./ReactClass"), + c = e("./ReactElement"), + l = e("./ReactUpdates"), + p = e("./Object.assign"), + d = e("./invariant"), + f = e("./warning"), + h = c.createFactory("textarea"), + v = u.createClass({ + displayName: "ReactDOMTextarea", + tagName: "TEXTAREA", + mixins: [o, i.Mixin, s], + getInitialState: function() { + var e = this.props.defaultValue, + t = this.props.children; + null != t && ("production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? f(!1, "Use the `defaultValue` or `value` props instead of setting children on -

- - - - - - - -
- - - Something went wrong with that request. Please try again. -
- - - - diff --git a/DS4Windows/HidLibrary/NativeMethods.cs b/DS4Windows/HidLibrary/NativeMethods.cs index 7a9b25c3ef..0b6de8a260 100644 --- a/DS4Windows/HidLibrary/NativeMethods.cs +++ b/DS4Windows/HidLibrary/NativeMethods.cs @@ -1,8 +1,10 @@ using System; using System.Runtime.InteropServices; +using System.Security; using Microsoft.Win32.SafeHandles; namespace DS4Windows { + [SuppressUnmanagedCodeSecurity] internal static class NativeMethods { [StructLayout(LayoutKind.Sequential)] @@ -74,10 +76,10 @@ internal struct SECURITY_ATTRIBUTES static internal extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES securityAttributes, int bManualReset, int bInitialState, string lpName); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static internal extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); + static internal extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, uint dwFlagsAndAttributes, int hTemplateFile); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - internal static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, Int32 dwShareMode, IntPtr lpSecurityAttributes, Int32 dwCreationDisposition, Int32 dwFlagsAndAttributes, Int32 hTemplateFile); + internal static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, Int32 dwShareMode, IntPtr lpSecurityAttributes, Int32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, Int32 hTemplateFile); [DllImport("kernel32.dll", SetLastError = true)] static internal extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped); @@ -229,7 +231,16 @@ internal struct SP_PROPCHANGE_PARAMS internal static DEVPROPKEY DEVPKEY_Device_BusReportedDeviceDesc = new DEVPROPKEY { fmtid = new Guid(0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2), pid = 4 }; - [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDeviceRegistryProperty")] + internal static DEVPROPKEY DEVPKEY_Device_HardwareIds = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 3 }; + + internal static DEVPROPKEY DEVPKEY_Device_UINumber = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 18 }; + + internal static DEVPROPKEY DEVPKEY_Device_DriverVersion = + new DEVPROPKEY { fmtid = new Guid(0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6), pid = 3 }; + + [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDeviceRegistryProperty")] public static extern bool SetupDiGetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, int propertyVal, ref int propertyRegDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize); [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDevicePropertyW", SetLastError = true)] @@ -391,7 +402,12 @@ internal struct HIDP_VALUE_CAPS [DllImport("hid.dll")] static internal extern int HidP_GetValueCaps(short reportType, ref byte valueCaps, ref short valueCapsLength, IntPtr preparsedData); +#if WIN64 [DllImport("hid.dll")] static internal extern bool HidD_GetSerialNumberString(IntPtr HidDeviceObject, byte[] Buffer, ulong BufferLength); +#else + [DllImport("hid.dll")] + static internal extern bool HidD_GetSerialNumberString(IntPtr HidDeviceObject, byte[] Buffer, uint BufferLength); +#endif } } diff --git a/DS4Windows/LogItem.cs b/DS4Windows/LogItem.cs new file mode 100644 index 0000000000..efc9e12b34 --- /dev/null +++ b/DS4Windows/LogItem.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS4WinWPF +{ + public class LogItem + { + private DateTime datetime; + private string message; + private bool warning; + + public DateTime Datetime { get => datetime; set => datetime = value; } + public string Message { get => message; set => message = value; } + public bool Warning { get => warning; set => warning = value; } + public string Color + { + get + { + return warning ? "Red" : "Black"; + } + } + } +} diff --git a/DS4Windows/LogWriter.cs b/DS4Windows/LogWriter.cs new file mode 100644 index 0000000000..56f7c5e760 --- /dev/null +++ b/DS4Windows/LogWriter.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.IO; + +namespace DS4WinWPF +{ + public class LogWriter + { + private string filename; + private List logCol; + + public LogWriter(string filename, List col) + { + this.filename = filename; + logCol = col; + } + + public void Process() + { + List outputLines = new List(); + foreach(LogItem item in logCol) + { + outputLines.Add($"{item.Datetime}: {item.Message}"); + } + + try + { + StreamWriter stream = new StreamWriter(filename); + foreach(string line in outputLines) + { + stream.WriteLine(line); + } + stream.Close(); + } + catch { } + } + } +} diff --git a/DS4Windows/LoggerHolder.cs b/DS4Windows/LoggerHolder.cs new file mode 100644 index 0000000000..6643938995 --- /dev/null +++ b/DS4Windows/LoggerHolder.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NLog; +using NLog.Targets.Wrappers; + +namespace DS4WinWPF +{ + public class LoggerHolder + { + private Logger logger;// = LogManager.GetCurrentClassLogger(); + public Logger Logger { get => logger; } + + public LoggerHolder(DS4Windows.ControlService service) + { + var configuration = LogManager.Configuration; + var wrapTarget = configuration.FindTargetByName("logfile") as WrapperTargetBase; + var fileTarget = wrapTarget.WrappedTarget as NLog.Targets.FileTarget; + fileTarget.FileName = $@"{DS4Windows.Global.appdatapath}\Logs\ds4windows_log.txt"; + fileTarget.ArchiveFileName = $@"{DS4Windows.Global.appdatapath}\Logs\ds4windows_log_{{#}}.txt"; + LogManager.Configuration = configuration; + LogManager.ReconfigExistingLoggers(); + + logger = LogManager.GetCurrentClassLogger(); + + service.Debug += WriteToLog; + DS4Windows.AppLogger.GuiLog += WriteToLog; + } + + private void WriteToLog(object sender, DS4Windows.DebugEventArgs e) + { + if (!e.Warning) + { + logger.Info(e.Data); + } + else + { + logger.Warn(e.Data); + } + } + } +} diff --git a/DS4Windows/NLog.config b/DS4Windows/NLog.config new file mode 100644 index 0000000000..897152450a --- /dev/null +++ b/DS4Windows/NLog.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DS4Windows/ProfileEntity.cs b/DS4Windows/ProfileEntity.cs new file mode 100644 index 0000000000..0d05632033 --- /dev/null +++ b/DS4Windows/ProfileEntity.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS4WinWPF +{ + public class ProfileEntity + { + private string name; + public string Name + { + get => name; + set + { + if (name == value) return; + name = value; + NameChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler NameChanged; + public event EventHandler ProfileSaved; + public event EventHandler ProfileDeleted; + + public void DeleteFile() + { + if (!string.IsNullOrWhiteSpace(name)) + { + string filepath = DS4Windows.Global.appdatapath + @"\Profiles\" + name + ".xml"; + if (File.Exists(filepath)) + { + File.Delete(filepath); + ProfileDeleted?.Invoke(this, EventArgs.Empty); + } + } + } + + public void SaveProfile(int deviceNum) + { + if (!string.IsNullOrWhiteSpace(name)) + { + DS4Windows.Global.SaveProfile(deviceNum, name); + DS4Windows.Global.CacheExtraProfileInfo(deviceNum); + } + } + + public void FireSaved() + { + ProfileSaved?.Invoke(this, EventArgs.Empty); + } + } +} diff --git a/DS4Windows/ProfileList.cs b/DS4Windows/ProfileList.cs new file mode 100644 index 0000000000..d7bc8a8792 --- /dev/null +++ b/DS4Windows/ProfileList.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace DS4WinWPF +{ + public class ProfileList + { + private object _proLockobj = new object(); + private ObservableCollection profileListCol = + new ObservableCollection(); + + public ObservableCollection ProfileListCol { get => profileListCol; set => profileListCol = value; } + + public ProfileList() + { + BindingOperations.EnableCollectionSynchronization(profileListCol, _proLockobj); + } + + public void Refresh() + { + profileListCol.Clear(); + string[] profiles = Directory.GetFiles(DS4Windows.Global.appdatapath + @"\Profiles\"); + foreach (string s in profiles) + { + if (s.EndsWith(".xml")) + { + ProfileEntity item = new ProfileEntity() + { + Name = Path.GetFileNameWithoutExtension(s) + }; + + profileListCol.Add(item); + } + } + } + + public void AddProfileSort(string profilename) + { + int idx = 0; + bool inserted = false; + foreach (ProfileEntity entry in profileListCol) + { + if (entry.Name.CompareTo(profilename) > 0) + { + profileListCol.Insert(idx, new ProfileEntity() { Name = profilename }); + inserted = true; + break; + } + idx++; + } + + if (!inserted) + { + profileListCol.Add(new ProfileEntity() { Name = profilename }); + } + } + + public void RemoveProfile(string profile) + { + var selectedEntity = profileListCol.SingleOrDefault(x => x.Name == profile); + if (selectedEntity != null) + { + int selectedIndex = profileListCol.IndexOf(selectedEntity); + profileListCol.RemoveAt(selectedIndex); + } + } + } +} diff --git a/DS4Windows/Program.cs b/DS4Windows/Program.cs deleted file mode 100644 index b03b573c11..0000000000 --- a/DS4Windows/Program.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Threading; -using System.Runtime.InteropServices; -using System.Diagnostics; -using System.ComponentModel; -using System.Globalization; - -namespace DS4Windows -{ - static class Program - { - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool SetForegroundWindow(IntPtr hWnd); - - [DllImport("user32.dll")] - private static extern IntPtr GetForegroundWindow(); - // Add "global\" in front of the EventName, then only one instance is allowed on the - // whole system, including other users. But the application can not be brought - // into view, of course. - private static String SingleAppComEventName = "{a52b5b20-d9ee-4f32-8518-307fa14aa0c6}"; - static Mutex mutex = new Mutex(true, "{FI329DM2-DS4W-J2K2-HYES-92H21B3WJARG}"); - private static BackgroundWorker singleAppComThread = null; - private static EventWaitHandle threadComEvent = null; - public static ControlService rootHub; - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) - { - //Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he"); - for (int i = 0; i < args.Length; i++) - { - string s = args[i]; - if (s == "driverinstall" || s == "-driverinstall") - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new WelcomeDialog()); - return; - } - else if (s == "re-enabledevice" || s == "-re-enabledevice") - { - try - { - i++; - string deviceInstanceId = args[i]; - DS4Devices.reEnableDevice(deviceInstanceId); - Environment.ExitCode = 0; - return; - } - catch (Exception) - { - Environment.ExitCode = Marshal.GetLastWin32Error(); - return; - } - } - } - System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency; - try - { - Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.High; - } - catch - { - // Ignore problems raising the priority. - } - try - { - // another instance is already running if OpenExsting succeeds. - threadComEvent = EventWaitHandle.OpenExisting(SingleAppComEventName); - threadComEvent.Set(); // signal the other instance. - threadComEvent.Close(); - return; // return immediatly. - } - catch { /* don't care about errors */ } - // Create the Event handle - threadComEvent = new EventWaitHandle(false, EventResetMode.AutoReset, SingleAppComEventName); - CreateInterAppComThread(); - - if (mutex.WaitOne(TimeSpan.Zero, true)) - { - rootHub = new ControlService(); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new DS4Form(args)); - mutex.ReleaseMutex(); - } - - // End the communication thread. - singleAppComThread.CancelAsync(); - while (singleAppComThread.IsBusy) - Thread.Sleep(50); - threadComEvent.Close(); - } - - static private void CreateInterAppComThread() - { - singleAppComThread = new BackgroundWorker(); - singleAppComThread.WorkerReportsProgress = false; - singleAppComThread.WorkerSupportsCancellation = true; - singleAppComThread.DoWork += new DoWorkEventHandler(singleAppComThread_DoWork); - singleAppComThread.RunWorkerAsync(); - } - - static private void singleAppComThread_DoWork(object sender, DoWorkEventArgs e) - { - BackgroundWorker worker = sender as BackgroundWorker; - WaitHandle[] waitHandles = new WaitHandle[] { threadComEvent }; - - while (!worker.CancellationPending) - { - // check every second for a signal. - if (WaitHandle.WaitAny(waitHandles, 1000) == 0) - { - // The user tried to start another instance. We can't allow that, - // so bring the other instance back into view and enable that one. - // That form is created in another thread, so we need some thread sync magic. - if (Application.OpenForms.Count > 0) - { - Form mainForm = Application.OpenForms[0]; - mainForm.Invoke(new SetFormVisableDelegate(ThreadFormVisable), mainForm); - } - } - } - } - - - /// - /// When this method is called using a Invoke then this runs in the thread - /// that created the form, which is nice. - /// - /// - private delegate void SetFormVisableDelegate(Form frm); - static private void ThreadFormVisable(Form frm) - { - if (frm != null) - { - if (frm is DS4Form) - { - // display the form and bring to foreground. - frm.WindowState = FormWindowState.Normal; - frm.Focus(); - } - else - { - WinProgs wp = (WinProgs)frm; - wp.form.mAllowVisible = true; - wp.ShowMainWindow(); - SetForegroundWindow(wp.form.Handle); - } - } - SetForegroundWindow(frm.Handle); - } - } -} \ No newline at end of file diff --git a/DS4Windows/Properties/AssemblyInfo.cs b/DS4Windows/Properties/AssemblyInfo.cs index 89532d7d85..da168ebcc4 100644 --- a/DS4Windows/Properties/AssemblyInfo.cs +++ b/DS4Windows/Properties/AssemblyInfo.cs @@ -1,8 +1,10 @@ using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Windows; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("DS4Windows")] @@ -10,27 +12,46 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("DS4Windows")] -[assembly: AssemblyCopyright("Copyright © Scarlet.Crush Productions 2012, 2013; InhexSTER, HecticSeptic, electrobrains 2013, 2014; Jays2Kings 2013, 2014, 2015")] +[assembly: AssemblyCopyright("Copyright © Scarlet.Crush Productions 2012, 2013; InhexSTER, HecticSeptic, electrobrains 2013, 2014; Jays2Kings 2013, 2014, 2015, 2016; Ryochan7 2017, 2018, 2019, 2020")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a52b5b20-d9ee-4f32-8518-307fa14aa0c6")] +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.4.52")] -[assembly: AssemblyFileVersion("1.4.52")] +[assembly: AssemblyVersion("2.0.14")] +[assembly: AssemblyFileVersion("2.0.14")] +[assembly: NeutralResourcesLanguage("")] +[assembly: Guid("a52b5b20-d9ee-4f32-8518-307fa14aa0c6")] diff --git a/DS4Windows/Properties/Resources.Designer.cs b/DS4Windows/Properties/Resources.Designer.cs index 8c205c4354..1ae264b200 100644 --- a/DS4Windows/Properties/Resources.Designer.cs +++ b/DS4Windows/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace DS4Windows.Properties { +namespace DS4WinWPF.Properties { using System; @@ -19,10 +19,10 @@ namespace DS4Windows.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -36,10 +36,10 @@ internal Resources() { /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4Windows.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4WinWPF.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -51,7 +51,7 @@ internal Resources() { /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -60,50 +60,10 @@ internal Resources() { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _360_highlight { - get { - object obj = ResourceManager.GetObject("_360_highlight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _360_map { - get { - object obj = ResourceManager.GetObject("_360_map", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _checked { - get { - object obj = ResourceManager.GetObject("_checked", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap A { - get { - object obj = ResourceManager.GetObject("A", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Name of this action already exists. /// - internal static string ActionExists { + public static string ActionExists { get { return ResourceManager.GetString("ActionExists", resourceCulture); } @@ -112,7 +72,7 @@ internal static string ActionExists { /// /// Looks up a localized string similar to Adding to list.... /// - internal static string AddingToList { + public static string AddingToList { get { return ResourceManager.GetString("AddingToList", resourceCulture); } @@ -121,7 +81,7 @@ internal static string AddingToList { /// /// Looks up a localized string similar to Add Programs. /// - internal static string AddPrograms { + public static string AddPrograms { get { return ResourceManager.GetString("AddPrograms", resourceCulture); } @@ -130,7 +90,7 @@ internal static string AddPrograms { /// /// Looks up a localized string similar to A location must be picked to continue. /// - internal static string ALocactionNeeded { + public static string ALocactionNeeded { get { return ResourceManager.GetString("ALocactionNeeded", resourceCulture); } @@ -139,7 +99,7 @@ internal static string ALocactionNeeded { /// /// Looks up a localized string similar to Always Rainbow Mode. /// - internal static string AlwaysRainbow { + public static string AlwaysRainbow { get { return ResourceManager.GetString("AlwaysRainbow", resourceCulture); } @@ -148,36 +108,25 @@ internal static string AlwaysRainbow { /// /// Looks up a localized string similar to Assign to Controller *number*. /// - internal static string AssignProfile { + public static string AssignProfile { get { return ResourceManager.GetString("AssignProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). /// - internal static System.Drawing.Bitmap B { + public static string AutoProfilePathAndWindowTitleEditTip { get { - object obj = ResourceManager.GetObject("B", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap BACK { - get { - object obj = ResourceManager.GetObject("BACK", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("AutoProfilePathAndWindowTitleEditTip", resourceCulture); } } /// /// Looks up a localized string similar to Battery: *number*%. /// - internal static string Battery { + public static string Battery { get { return ResourceManager.GetString("Battery", resourceCulture); } @@ -186,7 +135,7 @@ internal static string Battery { /// /// Looks up a localized string similar to Best used with right side as a mouse function. /// - internal static string BestUsedRightSide { + public static string BestUsedRightSide { get { return ResourceManager.GetString("BestUsedRightSide", resourceCulture); } @@ -195,26 +144,25 @@ internal static string BestUsedRightSide { /// /// Looks up a localized string similar to Browse.... /// - internal static string Browse { + public static string Browse { get { return ResourceManager.GetString("Browse", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Determines the poll rate used for the DS4 hardware when connected via Bluetooth. (Applies on profile save). /// - internal static System.Drawing.Bitmap BT { + public static string BTPollRate { get { - object obj = ResourceManager.GetObject("BT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("BTPollRate", resourceCulture); } } /// /// Looks up a localized string similar to Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows". /// - internal static string CannotMoveFiles { + public static string CannotMoveFiles { get { return ResourceManager.GetString("CannotMoveFiles", resourceCulture); } @@ -223,7 +171,7 @@ internal static string CannotMoveFiles { /// /// Looks up a localized string similar to Cannot write at current location. Copy Settings to appdata?. /// - internal static string CannotWriteHere { + public static string CannotWriteHere { get { return ResourceManager.GetString("CannotWriteHere", resourceCulture); } @@ -232,7 +180,7 @@ internal static string CannotWriteHere { /// /// Looks up a localized string similar to Charge the battery. /// - internal static string ChargeController { + public static string ChargeController { get { return ResourceManager.GetString("ChargeController", resourceCulture); } @@ -241,7 +189,7 @@ internal static string ChargeController { /// /// Looks up a localized string similar to Charged. /// - internal static string Charged { + public static string Charged { get { return ResourceManager.GetString("Charged", resourceCulture); } @@ -250,7 +198,7 @@ internal static string Charged { /// /// Looks up a localized string similar to Charging: *number*%. /// - internal static string Charging { + public static string Charging { get { return ResourceManager.GetString("Charging", resourceCulture); } @@ -259,16 +207,25 @@ internal static string Charging { /// /// Looks up a localized string similar to Check Battery. /// - internal static string CheckBattery { + public static string CheckBattery { get { return ResourceManager.GetString("CheckBattery", resourceCulture); } } + /// + /// Looks up a localized string similar to This will disconnect all your connected controllers. Proceed?. + /// + public static string CloseConfirm { + get { + return ResourceManager.GetString("CloseConfirm", resourceCulture); + } + } + /// /// Looks up a localized string similar to Close DS4Windows?. /// - internal static string CloseDS4W { + public static string CloseDS4W { get { return ResourceManager.GetString("CloseDS4W", resourceCulture); } @@ -277,7 +234,7 @@ internal static string CloseDS4W { /// /// Looks up a localized string similar to Close DS4Windows via the notification icon. /// - internal static string CloseMinimize { + public static string CloseMinimize { get { return ResourceManager.GetString("CloseMinimize", resourceCulture); } @@ -286,25 +243,34 @@ internal static string CloseMinimize { /// /// Looks up a localized string similar to Color. /// - internal static string Color { + public static string Color { get { return ResourceManager.GetString("Color", resourceCulture); } } /// - /// Looks up a localized string similar to Color by Battey %. + /// Looks up a localized string similar to Color by Battery %. /// - internal static string ColorByBattery { + public static string ColorByBattery { get { return ResourceManager.GetString("ColorByBattery", resourceCulture); } } + /// + /// Looks up a localized string similar to Confirm.... + /// + public static string Confirm { + get { + return ResourceManager.GetString("Confirm", resourceCulture); + } + } + /// /// Looks up a localized string similar to Connecting.... /// - internal static string Connecting { + public static string Connecting { get { return ResourceManager.GetString("Connecting", resourceCulture); } @@ -313,7 +279,7 @@ internal static string Connecting { /// /// Looks up a localized string similar to Edit Profile for Controller *number*. /// - internal static string ContextEdit { + public static string ContextEdit { get { return ResourceManager.GetString("ContextEdit", resourceCulture); } @@ -322,7 +288,7 @@ internal static string ContextEdit { /// /// Looks up a localized string similar to Make Profile for Controller *number*. /// - internal static string ContextNew { + public static string ContextNew { get { return ResourceManager.GetString("ContextNew", resourceCulture); } @@ -331,26 +297,16 @@ internal static string ContextNew { /// /// Looks up a localized string similar to Controller *Mac address* was removed or lost connection. /// - internal static string ControllerWasRemoved { + public static string ControllerWasRemoved { get { return ResourceManager.GetString("ControllerWasRemoved", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap copy { - get { - object obj = ResourceManager.GetObject("copy", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Copy complete, please relaunch DS4Windows and remove settings from Program Directory. /// - internal static string CopyComplete { + public static string CopyComplete { get { return ResourceManager.GetString("CopyComplete", resourceCulture); } @@ -359,7 +315,7 @@ internal static string CopyComplete { /// /// Looks up a localized string similar to Click to copy the full color. /// - internal static string CopyFullColor { + public static string CopyFullColor { get { return ResourceManager.GetString("CopyFullColor", resourceCulture); } @@ -368,7 +324,7 @@ internal static string CopyFullColor { /// /// Looks up a localized string similar to Warning: Could not open DS4 *Mac address* exclusively.. /// - internal static string CouldNotOpenDS4 { + public static string CouldNotOpenDS4 { get { return ResourceManager.GetString("CouldNotOpenDS4", resourceCulture); } @@ -377,7 +333,7 @@ internal static string CouldNotOpenDS4 { /// /// Looks up a localized string similar to day. /// - internal static string Day { + public static string Day { get { return ResourceManager.GetString("Day", resourceCulture); } @@ -386,35 +342,25 @@ internal static string Day { /// /// Looks up a localized string similar to days. /// - internal static string Days { + public static string Days { get { return ResourceManager.GetString("Days", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap delete { - get { - object obj = ResourceManager.GetObject("delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Delete Profile?. /// - internal static string DeleteProfile { + public static string DeleteProfile { get { return ResourceManager.GetString("DeleteProfile", resourceCulture); } } /// - /// Looks up a localized string similar to Dim by Battey %. + /// Looks up a localized string similar to Dim by Battery %. /// - internal static string DimByBattery { + public static string DimByBattery { get { return ResourceManager.GetString("DimByBattery", resourceCulture); } @@ -423,7 +369,7 @@ internal static string DimByBattery { /// /// Looks up a localized string similar to Turn off X360 input and only use the DS4's native input, hide ds4 must be off (Wired Only). /// - internal static string DinputOnly { + public static string DinputOnly { get { return ResourceManager.GetString("DinputOnly", resourceCulture); } @@ -432,7 +378,7 @@ internal static string DinputOnly { /// /// Looks up a localized string similar to Disconnect BT. /// - internal static string DisconnectBT { + public static string DisconnectBT { get { return ResourceManager.GetString("DisconnectBT", resourceCulture); } @@ -441,26 +387,16 @@ internal static string DisconnectBT { /// /// Looks up a localized string similar to Disconnected. /// - internal static string Disconnected { + public static string Disconnected { get { return ResourceManager.GetString("Disconnected", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DOWN { - get { - object obj = ResourceManager.GetObject("DOWN", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Downloading *number*%. /// - internal static string Downloading { + public static string Downloading { get { return ResourceManager.GetString("Downloading", resourceCulture); } @@ -469,7 +405,7 @@ internal static string Downloading { /// /// Looks up a localized string similar to Download Version *number* now?. /// - internal static string DownloadVersion { + public static string DownloadVersion { get { return ResourceManager.GetString("DownloadVersion", resourceCulture); } @@ -478,7 +414,7 @@ internal static string DownloadVersion { /// /// Looks up a localized string similar to Down. /// - internal static string DownText { + public static string DownText { get { return ResourceManager.GetString("DownText", resourceCulture); } @@ -487,257 +423,17 @@ internal static string DownText { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4 { + public static System.Drawing.Icon DS4 { get { object obj = ResourceManager.GetObject("DS4", resourceCulture); return ((System.Drawing.Icon)(obj)); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config { - get { - object obj = ResourceManager.GetObject("DS4_Config", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Circle { - get { - object obj = ResourceManager.GetObject("DS4_Config_Circle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Cross { - get { - object obj = ResourceManager.GetObject("DS4_Config_Cross", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Down { - get { - object obj = ResourceManager.GetObject("DS4_Config_Down", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_L1 { - get { - object obj = ResourceManager.GetObject("DS4_Config_L1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_L2 { - get { - object obj = ResourceManager.GetObject("DS4_Config_L2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Left { - get { - object obj = ResourceManager.GetObject("DS4_Config_Left", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_LS { - get { - object obj = ResourceManager.GetObject("DS4_Config_LS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Options { - get { - object obj = ResourceManager.GetObject("DS4_Config_Options", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_PS { - get { - object obj = ResourceManager.GetObject("DS4_Config_PS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_R1 { - get { - object obj = ResourceManager.GetObject("DS4_Config_R1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_R2 { - get { - object obj = ResourceManager.GetObject("DS4_Config_R2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Right { - get { - object obj = ResourceManager.GetObject("DS4_Config_Right", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_RS { - get { - object obj = ResourceManager.GetObject("DS4_Config_RS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Share { - get { - object obj = ResourceManager.GetObject("DS4_Config_Share", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Square { - get { - object obj = ResourceManager.GetObject("DS4_Config_Square", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchLeft { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchLeft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchMulti { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchMulti", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchRight { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchRight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchUpper { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchUpper", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Triangle { - get { - object obj = ResourceManager.GetObject("DS4_Config_Triangle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Up { - get { - object obj = ResourceManager.GetObject("DS4_Config_Up", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Controller { - get { - object obj = ResourceManager.GetObject("DS4_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_lightbar { - get { - object obj = ResourceManager.GetObject("DS4_lightbar", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to DS4Windows Update Available!. /// - internal static string DS4Update { + public static string DS4Update { get { return ResourceManager.GetString("DS4Update", resourceCulture); } @@ -746,7 +442,7 @@ internal static string DS4Update { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4W { + public static System.Drawing.Icon DS4W { get { object obj = ResourceManager.GetObject("DS4W", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -756,7 +452,7 @@ internal static System.Drawing.Icon DS4W { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4W___White { + public static System.Drawing.Icon DS4W___White { get { object obj = ResourceManager.GetObject("DS4W___White", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -766,54 +462,34 @@ internal static System.Drawing.Icon DS4W___White { /// /// Looks up a localized string similar to DS4Windows cannot edit settings here, This will now close. /// - internal static string DS4WindowsCannotEditHere { + public static string DS4WindowsCannotEditHere { get { return ResourceManager.GetString("DS4WindowsCannotEditHere", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap edit { - get { - object obj = ResourceManager.GetObject("edit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Edit. /// - internal static string EditProfile { + public static string EditProfile { get { return ResourceManager.GetString("EditProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. + /// Looks up a localized string similar to Allow touchpad mouse function to get toggled with PS + Touchpad Click.. /// - internal static System.IO.UnmanagedMemoryStream EE { + public static string EnableTouchToggle { get { - return ResourceManager.GetStream("EE", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap export { - get { - object obj = ResourceManager.GetObject("export", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("EnableTouchToggle", resourceCulture); } } /// /// Looks up a localized string similar to Fall Back. /// - internal static string FallBack { + public static string FallBack { get { return ResourceManager.GetString("FallBack", resourceCulture); } @@ -822,7 +498,7 @@ internal static string FallBack { /// /// Looks up a localized string similar to Fall Back to *button*. /// - internal static string FallBackTo { + public static string FallBackTo { get { return ResourceManager.GetString("FallBackTo", resourceCulture); } @@ -831,7 +507,7 @@ internal static string FallBackTo { /// /// Looks up a localized string similar to 5th Mouse Button Down. /// - internal static string FifthMouseDown { + public static string FifthMouseDown { get { return ResourceManager.GetString("FifthMouseDown", resourceCulture); } @@ -840,7 +516,7 @@ internal static string FifthMouseDown { /// /// Looks up a localized string similar to 5th Mouse Button Up. /// - internal static string FifthMouseUp { + public static string FifthMouseUp { get { return ResourceManager.GetString("FifthMouseUp", resourceCulture); } @@ -849,7 +525,7 @@ internal static string FifthMouseUp { /// /// Looks up a localized string similar to Click to change flash color. Black = default color. /// - internal static string FlashAtTip { + public static string FlashAtTip { get { return ResourceManager.GetString("FlashAtTip", resourceCulture); } @@ -858,7 +534,7 @@ internal static string FlashAtTip { /// /// Looks up a localized string similar to Flush HID. /// - internal static string FlushHID { + public static string FlushHID { get { return ResourceManager.GetString("FlushHID", resourceCulture); } @@ -867,7 +543,7 @@ internal static string FlushHID { /// /// Looks up a localized string similar to Flush HID Queue after each reading. /// - internal static string FlushHIDTip { + public static string FlushHIDTip { get { return ResourceManager.GetString("FlushHIDTip", resourceCulture); } @@ -876,7 +552,7 @@ internal static string FlushHIDTip { /// /// Looks up a localized string similar to Found Controller:. /// - internal static string FoundController { + public static string FoundController { get { return ResourceManager.GetString("FoundController", resourceCulture); } @@ -885,7 +561,7 @@ internal static string FoundController { /// /// Looks up a localized string similar to 4th Mouse Button Down. /// - internal static string FourthMouseDown { + public static string FourthMouseDown { get { return ResourceManager.GetString("FourthMouseDown", resourceCulture); } @@ -894,7 +570,7 @@ internal static string FourthMouseDown { /// /// Looks up a localized string similar to 4th Mouse Button Up. /// - internal static string FourthMouseUp { + public static string FourthMouseUp { get { return ResourceManager.GetString("FourthMouseUp", resourceCulture); } @@ -903,7 +579,7 @@ internal static string FourthMouseUp { /// /// Looks up a localized string similar to Full. /// - internal static string Full { + public static string Full { get { return ResourceManager.GetString("Full", resourceCulture); } @@ -912,16 +588,25 @@ internal static string Full { /// /// Looks up a localized string similar to Click to see readout of Sixaxis Gyro. /// - internal static string GyroReadout { + public static string GyroReadout { get { return ResourceManager.GetString("GyroReadout", resourceCulture); } } + /// + /// Looks up a localized string similar to Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active.. + /// + public static string GyroTriggerBehavior { + get { + return ResourceManager.GetString("GyroTriggerBehavior", resourceCulture); + } + } + /// /// Looks up a localized string similar to GyroX, Left and Right Tilt. /// - internal static string GyroX { + public static string GyroX { get { return ResourceManager.GetString("GyroX", resourceCulture); } @@ -930,7 +615,7 @@ internal static string GyroX { /// /// Looks up a localized string similar to GyroY, Forward and Back Tilt. /// - internal static string GyroY { + public static string GyroY { get { return ResourceManager.GetString("GyroY", resourceCulture); } @@ -939,7 +624,7 @@ internal static string GyroY { /// /// Looks up a localized string similar to GyroZ, Up and Down Tilt. /// - internal static string GyroZ { + public static string GyroZ { get { return ResourceManager.GetString("GyroZ", resourceCulture); } @@ -948,7 +633,7 @@ internal static string GyroZ { /// /// Looks up a localized string similar to hour. /// - internal static string Hour { + public static string Hour { get { return ResourceManager.GetString("Hour", resourceCulture); } @@ -957,7 +642,7 @@ internal static string Hour { /// /// Looks up a localized string similar to hours. /// - internal static string Hours { + public static string Hours { get { return ResourceManager.GetString("Hours", resourceCulture); } @@ -966,7 +651,7 @@ internal static string Hours { /// /// Looks up a localized string similar to Hover over items to see description or more about. /// - internal static string HoverOverItems { + public static string HoverOverItems { get { return ResourceManager.GetString("HoverOverItems", resourceCulture); } @@ -975,26 +660,16 @@ internal static string HoverOverItems { /// /// Looks up a localized string similar to If removing DS4Windows, You can delete the settings following the profile folder link. /// - internal static string IfRemovingDS4Windows { + public static string IfRemovingDS4Windows { get { return ResourceManager.GetString("IfRemovingDS4Windows", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap import { - get { - object obj = ResourceManager.GetObject("import", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to Input Delay: *number*ms. + /// Looks up a localized string similar to Input Delay: {0:0.##} ms. /// - internal static string InputDelay { + public static string InputDelay { get { return ResourceManager.GetString("InputDelay", resourceCulture); } @@ -1003,7 +678,7 @@ internal static string InputDelay { /// /// Looks up a localized string similar to Install Complete. /// - internal static string InstallComplete { + public static string InstallComplete { get { return ResourceManager.GetString("InstallComplete", resourceCulture); } @@ -1012,7 +687,7 @@ internal static string InstallComplete { /// /// Looks up a localized string similar to Install Drivers here. /// - internal static string InstallDriver { + public static string InstallDriver { get { return ResourceManager.GetString("InstallDriver", resourceCulture); } @@ -1021,7 +696,7 @@ internal static string InstallDriver { /// /// Looks up a localized string similar to Install Failed, Please Retry. /// - internal static string InstallFailed { + public static string InstallFailed { get { return ResourceManager.GetString("InstallFailed", resourceCulture); } @@ -1030,7 +705,7 @@ internal static string InstallFailed { /// /// Looks up a localized string similar to Installing.... /// - internal static string Installing { + public static string Installing { get { return ResourceManager.GetString("Installing", resourceCulture); } @@ -1039,7 +714,7 @@ internal static string Installing { /// /// Looks up a localized string similar to Use Sixaxis to help calculate touchpad movement. /// - internal static string Jitter { + public static string Jitter { get { return ResourceManager.GetString("Jitter", resourceCulture); } @@ -1048,73 +723,52 @@ internal static string Jitter { /// /// Looks up a localized string similar to Keep this window size after closing. /// - internal static string KeepThisSize { + public static string KeepThisSize { get { return ResourceManager.GetString("KeepThisSize", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number*'s latency now under 10ms. + /// Looks up a localized string similar to Language pack change will take effect after DS4Windows application is restarted.. /// - internal static string LatencyNotOverTen { + public static string LanguagePackApplyRestartRequired { get { - return ResourceManager.GetString("LatencyNotOverTen", resourceCulture); + return ResourceManager.GetString("LanguagePackApplyRestartRequired", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number*'s latency over 10ms. - /// - internal static string LatencyOverTen { - get { - return ResourceManager.GetString("LatencyOverTen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Launch *program*. - /// - internal static string LaunchProgram { - get { - return ResourceManager.GetString("LaunchProgram", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Controller *number*'s latency now under 10ms. /// - internal static System.Drawing.Bitmap LB { + public static string LatencyNotOverTen { get { - object obj = ResourceManager.GetObject("LB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LatencyNotOverTen", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Controller *number*'s latency over 10ms. /// - internal static System.Drawing.Bitmap LEFT { + public static string LatencyOverTen { get { - object obj = ResourceManager.GetObject("LEFT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LatencyOverTen", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Launch *program*. /// - internal static System.Drawing.Bitmap left_touch { + public static string LaunchProgram { get { - object obj = ResourceManager.GetObject("left_touch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LaunchProgram", resourceCulture); } } /// - /// Looks up a localized string similar to Also dim light by idle timeout if on. + /// Looks up a localized string similar to Also dim light by idle timeout if enabled when DS4 is fully charged. /// - internal static string LightByBatteryTip { + public static string LightByBatteryTip { get { return ResourceManager.GetString("LightByBatteryTip", resourceCulture); } @@ -1123,7 +777,7 @@ internal static string LightByBatteryTip { /// /// Looks up a localized string similar to Loading.... /// - internal static string Loading { + public static string Loading { get { return ResourceManager.GetString("Loading", resourceCulture); } @@ -1132,113 +786,88 @@ internal static string Loading { /// /// Looks up a localized string similar to Load *profile*. /// - internal static string LoadProfile { + public static string LoadProfile { get { return ResourceManager.GetString("LoadProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap LS { - get { - object obj = ResourceManager.GetObject("LS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Macro. /// - internal static System.Drawing.Bitmap LSD { + public static string Macro { get { - object obj = ResourceManager.GetObject("LSD", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("Macro", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Keep the last key state when macro execution is completed (ie. if a key is left in down state then it is not automatically reset back to default state). /// - internal static System.Drawing.Bitmap LSL { + public static string MacroKeepKeyStateTip { get { - object obj = ResourceManager.GetObject("LSL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroKeepKeyStateTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Macro Recorded. /// - internal static System.Drawing.Bitmap LSR { + public static string MacroRecorded { get { - object obj = ResourceManager.GetObject("LSR", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRecorded", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Repeat a macro while the trigger key is held down. /// - internal static System.Drawing.Bitmap LSU { + public static string MacroRepeatTip { get { - object obj = ResourceManager.GetObject("LSU", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRepeatTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Run a macro on the trigger key release. /// - internal static System.Drawing.Bitmap LT { + public static string MacroRunOnReleaseTip { get { - object obj = ResourceManager.GetObject("LT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRunOnReleaseTip", resourceCulture); } } /// - /// Looks up a localized string similar to Macro. + /// Looks up a localized string similar to Use a scan code value of keyboard keys in a macro. /// - internal static string Macro { + public static string MacroScanCodeTip { get { - return ResourceManager.GetString("Macro", resourceCulture); + return ResourceManager.GetString("MacroScanCodeTip", resourceCulture); } } /// - /// Looks up a localized string similar to Macro Recorded. + /// Looks up a localized string similar to Run multiple macros in synchronized order if the same trigger has several macros (key down macro completed before key release macro is run). /// - internal static string MacroRecorded { + public static string MacroSynchronizedRunTip { get { - return ResourceManager.GetString("MacroRecorded", resourceCulture); + return ResourceManager.GetString("MacroSynchronizedRunTip", resourceCulture); } } /// /// Looks up a localized string similar to Make a New Profile. /// - internal static string MakeNewProfile { + public static string MakeNewProfile { get { return ResourceManager.GetString("MakeNewProfile", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap mouse { - get { - object obj = ResourceManager.GetObject("mouse", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Mutli-Action Button. /// - internal static string MultiAction { + public static string MultiAction { get { return ResourceManager.GetString("MultiAction", resourceCulture); } @@ -1247,7 +876,7 @@ internal static string MultiAction { /// /// Looks up a localized string similar to N/A. /// - internal static string NA { + public static string NA { get { return ResourceManager.GetString("NA", resourceCulture); } @@ -1256,45 +885,25 @@ internal static string NA { /// /// Looks up a localized string similar to New. /// - internal static string New { + public static string New { get { return ResourceManager.GetString("New", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap newprofile { - get { - object obj = ResourceManager.GetObject("newprofile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to No macro was recorded. /// - internal static string NoMacroRecorded { + public static string NoMacroRecorded { get { return ResourceManager.GetString("NoMacroRecorded", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap none { - get { - object obj = ResourceManager.GetObject("none", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to (none). /// - internal static string noneProfile { + public static string noneProfile { get { return ResourceManager.GetString("noneProfile", resourceCulture); } @@ -1303,7 +912,7 @@ internal static string noneProfile { /// /// Looks up a localized string similar to none. /// - internal static string NoneText { + public static string NoneText { get { return ResourceManager.GetString("NoneText", resourceCulture); } @@ -1312,7 +921,7 @@ internal static string NoneText { /// /// Looks up a localized string similar to No Profile Loaded. /// - internal static string NoProfileLoaded { + public static string NoProfileLoaded { get { return ResourceManager.GetString("NoProfileLoaded", resourceCulture); } @@ -1321,7 +930,7 @@ internal static string NoProfileLoaded { /// /// Looks up a localized string similar to Controller *number* is not using a profile. /// - internal static string NotUsingProfile { + public static string NotUsingProfile { get { return ResourceManager.GetString("NotUsingProfile", resourceCulture); } @@ -1330,7 +939,7 @@ internal static string NotUsingProfile { /// /// Looks up a localized string similar to Not valid. /// - internal static string NotValid { + public static string NotValid { get { return ResourceManager.GetString("NotValid", resourceCulture); } @@ -1339,7 +948,7 @@ internal static string NotValid { /// /// Looks up a localized string similar to Opening Installer. /// - internal static string OpeningInstaller { + public static string OpeningInstaller { get { return ResourceManager.GetString("OpeningInstaller", resourceCulture); } @@ -1348,7 +957,7 @@ internal static string OpeningInstaller { /// /// Looks up a localized string similar to Please Open ScpDriver.exe. /// - internal static string OpenScpDriver { + public static string OpenScpDriver { get { return ResourceManager.GetString("OpenScpDriver", resourceCulture); } @@ -1357,26 +966,25 @@ internal static string OpenScpDriver { /// /// Looks up a localized string similar to , other location files will be deleted. /// - internal static string OtherFileLocation { + public static string OtherFileLocation { get { return ResourceManager.GetString("OtherFileLocation", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Choose the type of output virtual controller (Applies on profile save). /// - internal static System.Drawing.Bitmap Pairmode { + public static string OutContNotice { get { - object obj = ResourceManager.GetObject("Pairmode", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("OutContNotice", resourceCulture); } } /// - /// Looks up a localized string similar to Please Download the Updater now, and place it in the programs folder, then check for update again. + /// Looks up a localized string similar to Please Download the Updater now, place it in the programs folder and rename to DS4Updater.exe if on x86, then check for update again. /// - internal static string PleaseDownloadUpdater { + public static string PleaseDownloadUpdater { get { return ResourceManager.GetString("PleaseDownloadUpdater", resourceCulture); } @@ -1385,7 +993,7 @@ internal static string PleaseDownloadUpdater { /// /// Looks up a localized string similar to Please import or make a profile. /// - internal static string PleaseImport { + public static string PleaseImport { get { return ResourceManager.GetString("PleaseImport", resourceCulture); } @@ -1394,7 +1002,7 @@ internal static string PleaseImport { /// /// Looks up a localized string similar to New Profile. /// - internal static string PlusNewProfile { + public static string PlusNewProfile { get { return ResourceManager.GetString("PlusNewProfile", resourceCulture); } @@ -1403,7 +1011,7 @@ internal static string PlusNewProfile { /// /// Looks up a localized string similar to *Profile name* cannot be restored.. /// - internal static string ProfileCannotRestore { + public static string ProfileCannotRestore { get { return ResourceManager.GetString("ProfileCannotRestore", resourceCulture); } @@ -1412,7 +1020,7 @@ internal static string ProfileCannotRestore { /// /// Looks up a localized string similar to Profile Folder Moved to program folder. /// - internal static string ProfileFolderMoved { + public static string ProfileFolderMoved { get { return ResourceManager.GetString("ProfileFolderMoved", resourceCulture); } @@ -1421,172 +1029,124 @@ internal static string ProfileFolderMoved { /// /// Looks up a localized string similar to Programs. /// - internal static string Programs { + public static string Programs { get { return ResourceManager.GetString("Programs", resourceCulture); } } /// - /// Looks up a localized string similar to EXPERIMENTAL: Auto-Disable BT when conencting to USB. + /// Looks up a localized string similar to EXPERIMENTAL: Auto-Disable BT when connecting to USB. /// - internal static string QuickCharge { + public static string QuickCharge { get { return ResourceManager.GetString("QuickCharge", resourceCulture); } } /// - /// Looks up a localized string similar to You must quit other applications like Steam, Uplay before activating the 'Hide DS4 Controller' option.". + /// Looks up a localized string similar to You must quit other applications like UWP apps (Netflix), Steam, Uplay, NVIDIA IN-GAME before activating the 'Hide DS4 Controller' option. For more info check https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues. /// - internal static string QuitOtherPrograms { + public static string QuitOtherPrograms { get { return ResourceManager.GetString("QuitOtherPrograms", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap rainbow { - get { - object obj = ResourceManager.GetObject("rainbow", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap rainbowC { - get { - object obj = ResourceManager.GetObject("rainbowC", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RB { - get { - object obj = ResourceManager.GetObject("RB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Record. /// - internal static string RecordText { + public static string RecordText { get { return ResourceManager.GetString("RecordText", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RIGHT { - get { - object obj = ResourceManager.GetObject("RIGHT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Right Click to set presets for a set of controls. /// - internal static System.Drawing.Bitmap right_touch { + public static string RightClickPresets { get { - object obj = ResourceManager.GetObject("right_touch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("RightClickPresets", resourceCulture); } } /// - /// Looks up a localized string similar to Right Click to set presets for a set of controls. + /// Looks up a localized string similar to Tells Windows to start DS4Windows after login. /// - internal static string RightClickPresets { + public static string RunAtStartup { get { - return ResourceManager.GetString("RightClickPresets", resourceCulture); + return ResourceManager.GetString("RunAtStartup", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Calibration of sixaxis wheel emulation. /// - internal static System.Drawing.Bitmap RS { + public static string SASteeringWheelEmulationCalibrate { get { - object obj = ResourceManager.GetObject("RS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrate", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to All calibraton points are set when lightbar color turns to green. While turning the controller the lightbar color flashes when the controller is at calibration point. Accept calibration with OK button. /// - internal static System.Drawing.Bitmap RSD { + public static string SASteeringWheelEmulationCalibrateInstruction { get { - object obj = ResourceManager.GetObject("RSD", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (1) Center the controller, hold it steady and press "X". /// - internal static System.Drawing.Bitmap RSL { + public static string SASteeringWheelEmulationCalibrateInstruction1 { get { - object obj = ResourceManager.GetObject("RSL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction1", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (2) Turn to 90° left (or right) position and press "X". /// - internal static System.Drawing.Bitmap RSR { + public static string SASteeringWheelEmulationCalibrateInstruction2 { get { - object obj = ResourceManager.GetObject("RSR", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction2", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (3) Turn to 90° right (or left) position and press "X". /// - internal static System.Drawing.Bitmap RSU { + public static string SASteeringWheelEmulationCalibrateInstruction3 { get { - object obj = ResourceManager.GetObject("RSU", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction3", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Cannot calibrate gyro (sixaxis) steering wheel emulation values without a controller. Connect a controller via bluetooth or usb. /// - internal static System.Drawing.Bitmap RT { + public static string SASteeringWheelEmulationCalibrateNoControllerError { get { - object obj = ResourceManager.GetObject("RT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateNoControllerError", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Gyro steering wheel emulation axis option is set to NONE (emulation is not used). Please select an axis option before calibrating the sixaxis gyro steering wheel emulation. /// - internal static System.Drawing.Bitmap saveprofile { + public static string SASteeringWheelEmulationCalibrateNoneAxisError { get { - object obj = ResourceManager.GetObject("saveprofile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateNoneAxisError", resourceCulture); } } /// /// Looks up a localized string similar to Save Recorded Macro?. /// - internal static string SaveRecordedMacro { + public static string SaveRecordedMacro { get { return ResourceManager.GetString("SaveRecordedMacro", resourceCulture); } @@ -1595,16 +1155,16 @@ internal static string SaveRecordedMacro { /// /// Looks up a localized string similar to Scan Code. /// - internal static string ScanCode { + public static string ScanCode { get { return ResourceManager.GetString("ScanCode", resourceCulture); } } /// - /// Looks up a localized string similar to Searching for controllers…. + /// Looks up a localized string similar to Searching for controllers.... /// - internal static string SearchingController { + public static string SearchingController { get { return ResourceManager.GetString("SearchingController", resourceCulture); } @@ -1613,7 +1173,7 @@ internal static string SearchingController { /// /// Looks up a localized string similar to Select an action for *action*. /// - internal static string SelectActionTitle { + public static string SelectActionTitle { get { return ResourceManager.GetString("SelectActionTitle", resourceCulture); } @@ -1622,7 +1182,7 @@ internal static string SelectActionTitle { /// /// Looks up a localized string similar to Select a macro. /// - internal static string SelectMacro { + public static string SelectMacro { get { return ResourceManager.GetString("SelectMacro", resourceCulture); } @@ -1631,7 +1191,7 @@ internal static string SelectMacro { /// /// Looks up a localized string similar to Set Regular Trigger. /// - internal static string SetRegularTrigger { + public static string SetRegularTrigger { get { return ResourceManager.GetString("SetRegularTrigger", resourceCulture); } @@ -1640,7 +1200,7 @@ internal static string SetRegularTrigger { /// /// Looks up a localized string similar to Set Unload Trigger. /// - internal static string SetUnloadTrigger { + public static string SetUnloadTrigger { get { return ResourceManager.GetString("SetUnloadTrigger", resourceCulture); } @@ -1649,45 +1209,43 @@ internal static string SetUnloadTrigger { /// /// Looks up a localized string similar to Shortcuts. /// - internal static string Shortcuts { + public static string Shortcuts { get { return ResourceManager.GetString("Shortcuts", resourceCulture); } } /// - /// Looks up a localized string similar to Click for advanced Sixaxis reading. + /// Looks up a localized string similar to If enabled then Log tab page shows detailed messages of auto-profile events.. /// - internal static string SixAxisReading { + public static string ShowAutoProfileDebugLogTip { get { - return ResourceManager.GetString("SixAxisReading", resourceCulture); + return ResourceManager.GetString("ShowAutoProfileDebugLogTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Click for advanced Sixaxis reading. /// - internal static System.Drawing.Bitmap size { + public static string SixAxisReading { get { - object obj = ResourceManager.GetObject("size", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SixAxisReading", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Roundness of Square Stick corners. /// - internal static System.Drawing.Bitmap START { + public static string SquareStickRoundness { get { - object obj = ResourceManager.GetObject("START", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SquareStickRoundness", resourceCulture); } } /// /// Looks up a localized string similar to Starting.... /// - internal static string Starting { + public static string Starting { get { return ResourceManager.GetString("Starting", resourceCulture); } @@ -1696,16 +1254,16 @@ internal static string Starting { /// /// Looks up a localized string similar to Start. /// - internal static string StartText { + public static string StartText { get { return ResourceManager.GetString("StartText", resourceCulture); } } /// - /// Looks up a localized string similar to Step 1: Install the DS4 Driver. + /// Looks up a localized string similar to Step 1: Install the ViGEmBus Driver. /// - internal static string Step1 { + public static string Step1 { get { return ResourceManager.GetString("Step1", resourceCulture); } @@ -1714,7 +1272,7 @@ internal static string Step1 { /// /// Looks up a localized string similar to Stop Heavy. /// - internal static string StopHText { + public static string StopHText { get { return ResourceManager.GetString("StopHText", resourceCulture); } @@ -1723,7 +1281,7 @@ internal static string StopHText { /// /// Looks up a localized string similar to Stop Light. /// - internal static string StopLText { + public static string StopLText { get { return ResourceManager.GetString("StopLText", resourceCulture); } @@ -1732,7 +1290,7 @@ internal static string StopLText { /// /// Looks up a localized string similar to Stopped DS4Windows. /// - internal static string StoppedDS4Windows { + public static string StoppedDS4Windows { get { return ResourceManager.GetString("StoppedDS4Windows", resourceCulture); } @@ -1741,7 +1299,7 @@ internal static string StoppedDS4Windows { /// /// Looks up a localized string similar to Stopping DS4 Controllers. /// - internal static string StoppingDS4 { + public static string StoppingDS4 { get { return ResourceManager.GetString("StoppingDS4", resourceCulture); } @@ -1750,7 +1308,7 @@ internal static string StoppingDS4 { /// /// Looks up a localized string similar to Stopping X360 Controllers. /// - internal static string StoppingX360 { + public static string StoppingX360 { get { return ResourceManager.GetString("StoppingX360", resourceCulture); } @@ -1759,7 +1317,7 @@ internal static string StoppingX360 { /// /// Looks up a localized string similar to Stop. /// - internal static string StopText { + public static string StopText { get { return ResourceManager.GetString("StopText", resourceCulture); } @@ -1768,7 +1326,7 @@ internal static string StopText { /// /// Looks up a localized string similar to Swipe Down. /// - internal static string SwipeDown { + public static string SwipeDown { get { return ResourceManager.GetString("SwipeDown", resourceCulture); } @@ -1777,7 +1335,7 @@ internal static string SwipeDown { /// /// Looks up a localized string similar to Swipe Left. /// - internal static string SwipeLeft { + public static string SwipeLeft { get { return ResourceManager.GetString("SwipeLeft", resourceCulture); } @@ -1786,7 +1344,7 @@ internal static string SwipeLeft { /// /// Looks up a localized string similar to Swipe Right. /// - internal static string SwipeRight { + public static string SwipeRight { get { return ResourceManager.GetString("SwipeRight", resourceCulture); } @@ -1795,7 +1353,7 @@ internal static string SwipeRight { /// /// Looks up a localized string similar to Swipe Touchpad to change profiles. /// - internal static string SwipeTouchpad { + public static string SwipeTouchpad { get { return ResourceManager.GetString("SwipeTouchpad", resourceCulture); } @@ -1804,7 +1362,7 @@ internal static string SwipeTouchpad { /// /// Looks up a localized string similar to Swipe Up. /// - internal static string SwipeUp { + public static string SwipeUp { get { return ResourceManager.GetString("SwipeUp", resourceCulture); } @@ -1813,7 +1371,7 @@ internal static string SwipeUp { /// /// Looks up a localized string similar to Tap and hold to drag, slight delay with single taps. /// - internal static string TapAndHold { + public static string TapAndHold { get { return ResourceManager.GetString("TapAndHold", resourceCulture); } @@ -1822,7 +1380,7 @@ internal static string TapAndHold { /// /// Looks up a localized string similar to Test Heavy. /// - internal static string TestHText { + public static string TestHText { get { return ResourceManager.GetString("TestHText", resourceCulture); } @@ -1831,7 +1389,7 @@ internal static string TestHText { /// /// Looks up a localized string similar to Test Light. /// - internal static string TestLText { + public static string TestLText { get { return ResourceManager.GetString("TestLText", resourceCulture); } @@ -1840,7 +1398,7 @@ internal static string TestLText { /// /// Looks up a localized string similar to Test. /// - internal static string TestText { + public static string TestText { get { return ResourceManager.GetString("TestText", resourceCulture); } @@ -1849,7 +1407,7 @@ internal static string TestText { /// /// Looks up a localized string similar to Text Document (*.txt). /// - internal static string TextDocs { + public static string TextDocs { get { return ResourceManager.GetString("TextDocs", resourceCulture); } @@ -1858,7 +1416,7 @@ internal static string TextDocs { /// /// Looks up a localized string similar to Tilt Down. /// - internal static string TiltDown { + public static string TiltDown { get { return ResourceManager.GetString("TiltDown", resourceCulture); } @@ -1867,7 +1425,7 @@ internal static string TiltDown { /// /// Looks up a localized string similar to Tilt Left. /// - internal static string TiltLeft { + public static string TiltLeft { get { return ResourceManager.GetString("TiltLeft", resourceCulture); } @@ -1876,7 +1434,7 @@ internal static string TiltLeft { /// /// Looks up a localized string similar to Tilt Right. /// - internal static string TiltRight { + public static string TiltRight { get { return ResourceManager.GetString("TiltRight", resourceCulture); } @@ -1885,7 +1443,7 @@ internal static string TiltRight { /// /// Looks up a localized string similar to Tilt Up. /// - internal static string TiltUp { + public static string TiltUp { get { return ResourceManager.GetString("TiltUp", resourceCulture); } @@ -1894,7 +1452,7 @@ internal static string TiltUp { /// /// Looks up a localized string similar to Touchpad Movement is now Off. /// - internal static string TouchpadMovementOff { + public static string TouchpadMovementOff { get { return ResourceManager.GetString("TouchpadMovementOff", resourceCulture); } @@ -1903,7 +1461,7 @@ internal static string TouchpadMovementOff { /// /// Looks up a localized string similar to Touchpad Movement is now On. /// - internal static string TouchpadMovementOn { + public static string TouchpadMovementOn { get { return ResourceManager.GetString("TouchpadMovementOn", resourceCulture); } @@ -1912,7 +1470,7 @@ internal static string TouchpadMovementOn { /// /// Looks up a localized string similar to Re-enable by pressing PS+Touchpad. /// - internal static string TouchpadOffTip { + public static string TouchpadOffTip { get { return ResourceManager.GetString("TouchpadOffTip", resourceCulture); } @@ -1921,7 +1479,7 @@ internal static string TouchpadOffTip { /// /// Looks up a localized string similar to 2 finger touchpad swipe left or right. /// - internal static string TwoFingerSwipe { + public static string TwoFingerSwipe { get { return ResourceManager.GetString("TwoFingerSwipe", resourceCulture); } @@ -1930,7 +1488,7 @@ internal static string TwoFingerSwipe { /// /// Looks up a localized string similar to type new name here. /// - internal static string TypeNewName { + public static string TypeNewName { get { return ResourceManager.GetString("TypeNewName", resourceCulture); } @@ -1939,63 +1497,61 @@ internal static string TypeNewName { /// /// Looks up a localized string similar to type profile name here. /// - internal static string TypeProfileName { + public static string TypeProfileName { get { return ResourceManager.GetString("TypeProfileName", resourceCulture); } } /// - /// Looks up a localized string similar to Unassigned. + /// Looks up a localized string similar to You need to run DS4Windows as the Administrator in order to activate this mode.. /// - internal static string Unassigned { + public static string UACTask { get { - return ResourceManager.GetString("Unassigned", resourceCulture); + return ResourceManager.GetString("UACTask", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Enable UDP server. Server listen address and port. Address value options: 127.0.0.1 localhost only | 0.0.0.0 all addresses | Specific host name or IP address.. /// - internal static System.Drawing.Bitmap UP { + public static string UdpServer { get { - object obj = ResourceManager.GetObject("UP", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("UdpServer", resourceCulture); } } /// - /// Looks up a localized string similar to Up. + /// Looks up a localized string similar to Unassigned. /// - internal static string UpText { + public static string Unassigned { get { - return ResourceManager.GetString("UpText", resourceCulture); + return ResourceManager.GetString("Unassigned", resourceCulture); } } /// - /// Looks up a localized string similar to You are up to date. + /// Looks up a localized string similar to Up. /// - internal static string UpToDate { + public static string UpText { get { - return ResourceManager.GetString("UpToDate", resourceCulture); + return ResourceManager.GetString("UpText", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to You are up to date. /// - internal static System.Drawing.Bitmap USB { + public static string UpToDate { get { - object obj = ResourceManager.GetObject("USB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("UpToDate", resourceCulture); } } /// /// Looks up a localized string similar to You can also use your controller to change controls. /// - internal static string UseControllerForMapping { + public static string UseControllerForMapping { get { return ResourceManager.GetString("UseControllerForMapping", resourceCulture); } @@ -2004,16 +1560,16 @@ internal static string UseControllerForMapping { /// /// Looks up a localized string similar to Using Exclusive Mode. /// - internal static string UsingExclusive { + public static string UsingExclusive { get { return ResourceManager.GetString("UsingExclusive", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number* is using Profile “*Profile name*". + /// Looks up a localized string similar to Controller *number* is using Profile "*Profile name*". /// - internal static string UsingProfile { + public static string UsingProfile { get { return ResourceManager.GetString("UsingProfile", resourceCulture); } @@ -2022,7 +1578,7 @@ internal static string UsingProfile { /// /// Looks up a localized string similar to Using Shared Mode. /// - internal static string UsingShared { + public static string UsingShared { get { return ResourceManager.GetString("UsingShared", resourceCulture); } @@ -2031,7 +1587,7 @@ internal static string UsingShared { /// /// Looks up a localized string similar to This disables the Touchpad as a mouse. /// - internal static string UsingTPSwipes { + public static string UsingTPSwipes { get { return ResourceManager.GetString("UsingTPSwipes", resourceCulture); } @@ -2040,7 +1596,7 @@ internal static string UsingTPSwipes { /// /// Looks up a localized string similar to Please enter a valid name. /// - internal static string ValidName { + public static string ValidName { get { return ResourceManager.GetString("ValidName", resourceCulture); } @@ -2049,7 +1605,7 @@ internal static string ValidName { /// /// Looks up a localized string similar to Wait *number*ms. /// - internal static string WaitMS { + public static string WaitMS { get { return ResourceManager.GetString("WaitMS", resourceCulture); } @@ -2058,48 +1614,19 @@ internal static string WaitMS { /// /// Looks up a localized string similar to Will Keep. /// - internal static string WillKeep { + public static string WillKeep { get { return ResourceManager.GetString("WillKeep", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap X { - get { - object obj = ResourceManager.GetObject("X", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to Use higher ports if you get conflicts in other emulating X360 programs, such as SCP's tool. - /// - internal static string XinputPorts { - get { - return ResourceManager.GetString("XinputPorts", resourceCulture); - } - } - /// /// Looks up a localized string similar to XML Files (*.xml). /// - internal static string XMLFiles { + public static string XMLFiles { get { return ResourceManager.GetString("XMLFiles", resourceCulture); } } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Y { - get { - object obj = ResourceManager.GetObject("Y", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } } } diff --git a/DS4Windows/Properties/Resources.ar.resx b/DS4Windows/Properties/Resources.ar.resx deleted file mode 100644 index b088123e0c..0000000000 --- a/DS4Windows/Properties/Resources.ar.resx +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - اسم هذا الإجراء مستخدم - - - إضافة إلى القائمة... - - - أضف برنامج - - - يجب أن تختار مسارا للإستمرار - - - دائما في نمط قوس قزح - - - عين إلي يد *number* - - - البطارية: *number*% - - - يفضل استخدامه مع الجهة اليمنى كفأرة - - - تصفح... - - - لا يمكن نقل الملفات لموقع جديد، الرجاء إعادة تسمية ملف DS4Tool إلى "DS4Windows" - - - لا يمكن الكتابة في الموقع الحالي, نسخ الإعدادات إلى ملف appdata؟ - - - اشحن البطارية - - - مشحون - - - يتم الشحن: *number*% - - - تحقق من البطارية - - - أغلق البرنامج؟ - - - أغلق البرنامج عن طريق رمز التنبيه - - - لون - - - اللون بمستوى الشحن % - - - توصيل... - - - تعديل السجل لليد *number* - - - إنشاء سجل لليد *number* - - - يد *Mac address* تم إزالتها أو فقد الإتصال - - - اكتمل النسخ، الرجاء إعادة تشغيل البرنامج و إزالة الإعدادات من ملف البرنامج - - - انقر لنسخ اللون كاملا - - - تحذير: لا يمكن تشغيل يد *Mac address* بشكل حصري - - - يوم - - - أيام - - - حذف السجل؟ - - - تعتيم بحسب البطارية % - - - أغلق إدخال 360 و استخدم إدخال يد البلاي ستايشن 4 فقط، إخفاء يد البلاي ستايشن 4 يجب أن يكون مغلقا (فقط للموصل بالسلك) - - - افصل البلوتوث - - - انفصل - - - تحميل *number*% - - - تحميل اصدار *number* الآن؟ - - - تحت - - - يوجد تحديث متاح! - - - البرنامج لا يستطيع تعديل الإعدادات هنا، هذا سيغلق الآن - - - تعديل - - - العودة - - - العودة إلى *button* - - - زر الفأرة الخامس للأسفل - - - زر الفأرة الخامس للأعلى - - - نقر لتغيير لون الإيماض، الأسود = اللون الإفتراضي - - - حذف HID - - - حذف سلسلة HID بعد كل قراءة - - - وجد يد: - - - زر الفأرة الرابع للأسفل - - - زر الفأرة الرابع للأعلى - - - كامل - - - انقر لرؤية قراءات الحساسات - - - دوام السين، المليان لليمين و اليسار - - - دوّام الصاد، المليان للأمام و الخلف - - - دوّام العين، المليان للأعلى و الأسفل - - - ساعة - - - ساعات - - - ضع الفأرة على البنود لترى الوصف و التعليمات - - - عند إزالة البرنامج، تستطيع حذف الإعدادات عن طريق تتبع رابط ملف السجلات - - - تأخر الإدخال: *number* مللي ثانية - - - تم التثبيت - - - ثبت المعرفات هنا - - - فشل التثبيت، الرجاء إعادة المحاولة - - - يتم التثبيت... - - - استخدم Sixaxis لحساب حركة شاشة اللمس - - - أبق حجم الصفحة بعد الغلق - - - تأخر اليد *number* أقل من 10 مللي ثانية - - - تأخر اليد *number* أكثر من 10 مللي ثانية - - - شغل *program* - - - و عتم الضوء بعد الكمون لو كان مشغلا - - - تحميل... - - - تحميل *profile* - - - ماكرو - - - إنشاء سجل جديد - - - لا يوجد - - - جديد - - - لا يوجد ماكرو مسجل - - - لا يوجد - - - لا يوجد - - - لا سجل محمل - - - اليد *number* لا تستخدم سجل - - - غير صالح - - - فتح المثبت - - - الرجاء تشغيل ScpDriver.exe - - - ، الملفات في الأماكن الأخرى ستحذف - - - الرجاء تحميل المحدِّث الآن، و وضعه في ملف البرنامج، ثم تحقق من وجود تحديث مرة أخرى - - - الرجاء إنشاء أو استيراد سجل - - - سجل جديد - - - لا يمكن استعادة *Profile name* - - - ملف السجل نقل إلى ملف البرنامج - - - البرامج - - - تجريبي: فصل البلوتوث بشكل تلقائي عند التوصيل بالسلك - - - يجب إغلاق البرامج الأخرى مثل ستيم و اليو-بلاي قبل تفعيل خيار "إخفاء يد البلاي ستايشن 4" - - - تسجيل - - - النقر باليمين لوضع مجهّز لعدة تحكم - - - حفظ الماكرو المسجل؟ - - - سكان كود - - - البحث عن أيادي... - - - اختر أمر لـ *action* - - - تحديد كزناد عادي - - - تحديد كزناد ملغى - - - إختصارات - - - انقر لقراءات متقدمة لـ Sixaxis - - - يبدأ... - - - بداية - - - الخطوة 1: تثبيت معرّف يد البلاي ستايشن 4 - - - إيقاف القوي - - - إيقاف الضعيف - - - أوقف البرنامج - - - يتم ايقاف ايادي البلاي ستايشن 4 - - - يتم ايقاف ايادي 360 - - - ايقاف - - - مسح للأسفل - - - مسح لليسار - - - مسح لليمين - - - ميح شاشة اللمس لتغيير السجل - - - مسح للأعلى - - - اللمس للسحب، تأخر طفيف للنقرات المنفردة - - - تجريب القوي - - - تجريب الضعيف - - - تجريب - - - ميلان للأسفل - - - ميلان للأعلى - - - ميلن لليسار - - - مليان لليمين - - - حركة شاشة اللمس معطلة - - - حركة شاشة اللمس مفعلة - - - أعد التفعيل بضغط زر البلاي ستايشن + شاشة اللمس - - - المسح بإصبعين لليسار و اليمين - - - اكتب اسم جديد هنا - - - اكتب اسم للسجل هنا - - - اعلى - - - البرنامج في أحدث إصدار - - - تستطيع استخدام اليد لتغيير التحكم - - - يتم استخدام النمط الحصري - - - اليد *number* تستخدم السجل “*Profile name*" - - - يتم استخدام نمط المشاركة - - - هذا يعطل عمل شاشة اللمس كفأرة - - - ارجاء إدخال اسم صالح - - - انتظار *number* مللي ثانية - - - سيبقى - - - استخدم خانات أعلى لو حصل تعارض مع برامج محاكاة 360 أخرى مثل برنامج SCP's tool - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.cs.resx b/DS4Windows/Properties/Resources.cs.resx deleted file mode 100644 index 4eb7aee9f5..0000000000 --- a/DS4Windows/Properties/Resources.cs.resx +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Akce s tímto názvem již existuje - - - Přidávám do seznamu... - - - Přidat programy - - - Test - - - Textový dokument (*.txt) - - - Pohyb touhpadu je vypnutý - - - Pohyb touhpadu je zapnutý - - - Znovu aktivujte stisknutím tlačítka PS+Touchpadu - - - zadejte nový název - - - zadejte nový název profilu - - - Nepřiřazeno - - - Nahoru - - - Máte aktuální verzi - - - Ovladač můžete použít pro změnu ovládání - - - Exkluzivní režim je používán - - - Ovladač *number* používá profil "*Profile name*" - - - Sdílený režim je používán - - - Tímto vypnete chování touchpadu jako myši - - - Prosím, zadejte platný název - - - Počkat *number*ms - - - Ponechat - - - Při konfliktu s jinými programy na emulaci X360 (například SCP) použijte vyšší porty - - - XML soubory (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.de-DE.resx b/DS4Windows/Properties/Resources.de-DE.resx deleted file mode 100644 index a35ea6140e..0000000000 --- a/DS4Windows/Properties/Resources.de-DE.resx +++ /dev/null @@ -1,564 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Name dieser Aktion existiert bereits - - - Zur Liste Hinzufügen ... - - - Programme Hinzufügen - - - Ein Ort muss angegeben werden, um fortzufahren. - - - Permanenter Regenbogen Modus - - - Controller *number* zuweisen - - - Batterie: *number*% - - - Wird am besten mit der rechten Seite als Mausfunktion verwendet. - - - Durchsuchen ... - - - Kann im aktuellen Verzeichnis nicht speichern. Sollen die Einstellungen nach Appdata kopiert werden? - - - Aufgeladen - - - Wird aufgeladen: *number*% - - - Batterie prüfen - - - DS4Windows schließen? - - - Beende DS4Windows über das Benachrichtigungssymbol - - - Farbe - - - Farbe wird nach der Akkulaufzeit eingestellt - - - Verbinde ... - - - Bearbeite Profil für Controller *number* - - - Erstelle Profil für Controller *number* - - - Controller *Mac address* wurde entfernt oder hat die Verbindung verloren. - - - Kopieren abgeschlossen, bitte DS4Windows neustarten und Einstellungen aus dem Programmverzeichnis entfernen. - - - Klicken um Farbe zu kopieren - - - Warnung: Konnte DS4 *Mac address* nicht exklusiv öffnen. - - - Tag - - - Tage - - - Profil löschen? - - - Dimmen, wenn der Akku weniger als % hat. - - - Schalte X360 Eingabemethode aus und benutze nur DS4's systemeigene Eingabemethode. "Verstecke DS4 Controller" muss bei Kabelverbindung deaktiviert sein. - - - Bluetooth-Verbindung trennen - - - Getrennt - - - Lade herunter *number*% - - - Version *number* herunterladen? - - - Unten - - - DS4Windows Aktualisierung verfügbar! - - - DS4Windows kann hier nicht die Einstellungen bearbeiten. Fenster wird nun geschlossen. - - - Ändern - - - Zurückfallen - - - 5. Maustaste runter - - - 5. Maustaste hoch - - - Klicken, um die Farbe des Lichtbalkens zu ändern. Schwarz = Standardfarbe - - - Leere HID - - - HID Queue nach jeder Auslesung leeren - - - Controller gefunden: - - - 4. Maustaste unten - - - 4. Maustaste hoch - - - Voll - - - Klicken, um die Sixaxis Gyro Auslesung anzuzeigen - - - GyroX, links und rechts neigen - - - GyroY, vorwärts und rückwärts neigen - - - GyroZ, hoch und runter neigen - - - Stunde - - - Stunden - - - Fahre über die Elemente, um die Beschreibung zu sehen. - - - Wenn du DS4Windows entfernst, kannst du die Einstellungen löschen. Folge dazu dem Link zum Profilordner. - - - Eingabeverzögerung: *number*ms - - - Installation abgeschlossen - - - Treiber hier installieren - - - Installiere ... - - - Verwende Sixaxis, um die Berechnung der Touchpad-Bewegung zu verbessern. - - - Fenstergröße speichern - - - Latenz von Controller *number* ist nun unter 10ms - - - Latenz von Controller *number* ist über 10ms - - - Starte *program* - - - Bei Leerlauf Licht dimmen EIN - - - Lade ... - - - Lade *profile* - - - Makro - - - Erstelle ein neues Profil - - - N/A - - - Neu - - - Es wurde kein Makro aufgezeichnet. - - - (nichts) - - - leer - - - Kein Profil geladen - - - Controller *number* benutzt kein Profil - - - Ungültig - - - Starte Installationsprogramm - - - Bitte ScpDrivers.exe starten - - - , Dateien an anderen Speicherorten werden gelöscht - - - Lade bitte den Updater herunter und kopiere ihn dann ins Programmverzeichnis. Suche anschließend erneut nach einer Aktualisierung. - - - Bitte erstelle oder importiere ein Profil - - - Neues Profil - - - *Profile name* kann nicht wiederhergestellt werden. - - - Profilordner wurde in den Programmordner verschoben. - - - Programme - - - Experimentell: Deaktiviere die Bluetooth-Verbindung automatisch, wenn per USB verbunden wird. - - - Du musst andere Programme wie Steam oder Uplay beenden, bevor du die Option, "Verstecke DS4 Controller" aktivierst. - - - Aufnehmen - - - Rechtsklick, um eine Voreinstellung für eine Reihe von Steuerungen zu setzen. - - - Aufgezeichnetes Makro speichern? - - - Scancode - - - Suche nach Controllern ... - - - Wähle eine Aktion für *action* - - - Normalen-Auslöser setzen - - - Entfernungsauslöser setzen - - - Tastenkürzel - - - Klicken, für erweiterterte Sixaxis Auslesung - - - Starte ... - - - Starten - - - Schritt 1: Installiere den DS4 Treiber - - - starke stoppen - - - schwache stoppen - - - DS4Windows beendet - - - Beende DS4 Controller - - - Beende X360 Controller - - - Stoppen - - - nach unten streichen - - - nach links streichen - - - nach rechts streichen - - - Streiche über das Touchpad, um das Profil zu wechseln. - - - nach oben streichen - - - Tippe und halte zum Ziehen - leichte Verzögerung bei einzelnen tips - - - starke testen - - - schwache testen - - - Neigung nach Unten - - - Neigung nach Links - - - Neigung nach Rechts - - - Neigung nach Oben - - - Touchpad Bewegung ist jetzt Aus - - - Touchpad Bewegung ist jetzt An - - - Zum Reaktivieren, drücke PS + Touchpad. - - - Streichgeste mit 2 Fingern nach links oder rechts - - - Neuen Namen hier eingeben - - - Profilnamen hier eingeben - - - Hoch - - - DS4Windows ist auf dem neuesten Stand - - - Du kannst auch den Controller verwenden, um die Bedienung zu ändern. - - - Benutze exklusiven Modus - - - Controller *number* benutzt jetzt Profil "*Profile name*" - - - Benutze geteilten Modus - - - Dies deaktiviert, dass das Touchpad als Maus benutzt werden kann. - - - Bitte gültigen Namen eingeben - - - Warte *number*ms - - - Wird gehalten - - - Verwende höher liegende Ports, wenn Konflikte mit anderen X360 Simulationsprogrammen, wie SCP's Serviceprogramm, auftreten. - - - DS4Windows beendet - - - Text Dokument (*.txt) - - - Die Batterie aufladen - - - Installation fehlgeschlagen, bitte erneut versuchen - - - XML Dateien (*.xml) - - - Nicht Zugewiesen - - - Makro aufgezeichnet - - - Multi-Aktions Knopf - - - Wähle ein Makro aus - - - Test - - - Dateien können nicht zu neuem Ziel bewegt werden. Bitte ändern Sie den Namen des DS4Tool Verzeichnisses zu "DS4Windows" - - - Falle zurück zu *button* - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.es.resx b/DS4Windows/Properties/Resources.es.resx deleted file mode 100644 index f27f10d012..0000000000 --- a/DS4Windows/Properties/Resources.es.resx +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Agregar a la lista - - - Agregar programas - - - Siempre Modo Alcoiris - - - Asignar a Controlador *number* - - - Batería: *number*% - - - Preferible usar lado derecho como función del mouse. - - - Buscar... - - - No se puede modificar este archivo. ¿Mover preferencias a "appdata"? - - - Cargado - - - Cargando: *number*% - - - Color - - - Color por % de Batería - - - Conectando... - - - Editar perfil para el Controlador *number* - - - Crear perfil para el Controlador *number* - - - Controlador *Mac address* perdió la conexión o fue desconectado - - - Copia completa, por favor reinicia DS4Windows y elimina preferencias del directorio de programa - - - Haz click para copiar todo el color. - - - Advertencia: No se puede abrir DS4 *Mac address* exclusivamente. - - - día - - - días - - - Borrar perfil? - - - Apagar la entrada X360 y utilizar solo la entrada nativa DS4, ocultar ds4 debe estar apagado - - - Desconectado - - - Descargando *number*% - - - Descargar version *number* ahora? - - - Abajo - - - DS4Windows tiene una actualización disponible! - - - DS4Windows no puede editar la configuración aquí, Esto se cerrará ahora - - - Editar - - - Brillar HID - - - Controlador Encontrado: - - - Completo - - - hora - - - horas - - - Si borras DS4Windows, puedes eliminar la configuración siguiendo el enlace Carpeta de Perfil - - - Retraso de entrada: *number*ms - - - Instalación Completada - - - Instalar Drivers aquí - - - Instalando... - - - Mantener este tamaño de ventana después de cerrar - - - Cargando... - - - Crear un Nuevo Perfil - - - N/A - - - Nuevo - - - Ningún macro fue grabado - - - (ninguno) - - - ninguno - - - Ningún perfil cargado - - - No válido - - - Abriendo Instalador - - - Por favor abre ScpDriver.exe - - - Por favor importa o crea un perfil - - - *Profile name* no puede ser restaurado. - - - Carpeta de Perfil se ha movido a Carpeta de Programa - - - Debes salir de otras aplicaciones como Steam, Uplay antes de activar la opción "Ocultar controlador DS4" - - - Grabar - - - Guardar Macro grabado? - - - Buscando controladores... - - - Selecciona una acción para *action* - - - Iniciando... - - - Inicio - - - Paso 1: Instala el Driver DS4 - - - Detener Vib. Pesada - - - Detener Vib. Ligera - - - DS4Windows detenido - - - Deteniendo Controladores DS4 - - - Deteniendo Controladores X360 - - - Detener - - - Desliza el Panel Táctil para cambiar perfiles - - - Mantenga pulsado para arrastrar, ligero retraso con toques simples - - - Prueba Vib. Pesada - - - Prueba Vib. Ligera - - - Inclinacion Abajo - - - Inclinacion Izquierda - - - Inclinacion Derecha - - - Inclinacion Arriba - - - Movimiento de Panel Táctil Apagado - - - Movimiento de Panel Táctil Encendido - - - escriba nuevo nombre aquí - - - escriba nombre de perfil aquí - - - Arriba - - - Actualizado - - - También puedes utilizar tu controlador para cambiar controles - - - Usando Modo Exclusivo - - - Controlador *number* está usando perfil "*Profile name*" - - - Usando Modo Compartido - - - Por favor ingresa un nombre válido - - - Espere *number*ms - - - Se mantendrá - - - Nuevo Perfil - - - El nombre de esta acción ya existe - - - Una ubicación tiene que ser elegida para continuar - - - Verificar la batería - - - Cerrar DS4Windows? - - - Cierra DS4Windows vía el icono de notificación - - - Atenuar al % de la batería - - - Desconecta BT - - - Retroceder - - - 5º Botón del Ratón Abajo - - - 5º Botón del Ratón Arriba - - - Haz click para cambiar el color del flash. Negro = Color por defecto - - - Brillar HID después de cada lectura - - - 4º Botón del Ratón Abajo - - - 4º Botón del Ratón Arriba - - - Haz click para ver la lectura de Sixaxis Gyro - - - GyroX, Inclinación Izquierda y Derecha - - - GyroY, Inclinación hacia Delante y Atrás - - - GyroZ, Inclinación hacia Arriba y Abajo - - - Pasa el ratón sobre los elementos para ver la descripción o más sobre el - - - Utiliza Sixaxis para ayudar a calcular el movimiento del Panel Táctil - - - Controlador *number* tiene menos de 10ms de latencia - - - Controlador *number* tiene más de 10ms de latencia - - - Abrir *program* - - - También atenuar la luz por tiempo de inactividad, si está encendida - - - Cargar *profile* - - - Macro - - - Controlador *number* no está utilizando un perfil - - - , otros archivos de localización serán eliminados - - - Por favor Descarga el Actualizador ahora, colócalo en la carpeta programas, y luego busca si hay nuevas actualizaciones - - - Programas - - - EXPERIMENTAL: Auto-desactiva BT cuando se conecta a USB - - - Click Derecho para configurar ajustes preestablecidos para un conjunto de controles - - - Código de escaneo - - - Establece Gatillo Regular - - - Establece descarga de Gatillo - - - Atajos - - - Haz click para leer Sixaxis avanzado - - - DS4Windows detenido - - - Desliza hacia Abajo - - - Desliza hacia la Izquierda - - - Desliza hacia la Derecha - - - Desliza hacia Arriba - - - Inclinacion Abajo - - - Rehabilita pulsando PS+Panel Táctil - - - 2 dedos en el Panel Táctil desliza derecha o izquierda - - - Esto desactiva el panel táctil como un ratón - - - No se pueden mover los archivos a otra ubicación, por favor, renombre la carpeta de DS4Tool a "DS4Windows" - - - Cargar la batería - - - Retroceder a *button* - - - La instalación ha fallado, por favor vuelva a intentarlo - - - Test - - - Utiliza puertos más altos si tienes conflictos en otros programas de emulación X360, como la herramienta SCP - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.fi.resx b/DS4Windows/Properties/Resources.fi.resx deleted file mode 100644 index e314f7d712..0000000000 --- a/DS4Windows/Properties/Resources.fi.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Samanniminen toiminto on jo olemassa - - - Lisätään listaan... - - - Lisää ohjelmia - - - Kohde on valittava jatkaaksesi - - - Käytä aina sateenkaari-tilaa - - - Aseta ohjaimeen *number* - - - Akun tila: *number*% - - - Toimii parhaiten jos oikeaa puolta käytetään hiirenä - - - Selaa... - - - Tiedostoja ei voida siirtää. Nimeä DS4Tool-kansio "DS4Windows"-kansioksi - - - Kohteeseen ei voida kirjoittaa. Kopioi asetukset appdataan-kansioon? - - - Lataa akku - - - Ladattu - - - Ladataan: *number*% - - - Tarkista akku - - - Sulje DS4Windows? - - - Sulje DS4Windows ilmoituspalkista. - - - Väri - - - Väri akun tilan mukaan - - - Yhdistetään... - - - Muokkaa profiilia ohjaimelle *number* - - - Uusi profiili ohjaimelle *number* - - - Ohjain *Mac address* yhteys katkesi - - - Kopiointi valmis. Käynnistä DS4Windows uudelleen ja poista asetukset ohjelma-kansiosta - - - Klikkaa kopioidaksesi väri - - - Varoitus: Ei voitu avata DS4 *Mac address* exclusive modessa. - - - päivä - - - päivää - - - Poista profiili? - - - Himmennä akun tilan mukaan - - - Kytke pois X360 inputlaite ja käytä vain DS4-natiivisyöttötietoja. DS4:n piilotus täytyy olla pois päältä (Vain langallinen) - - - Kytke Bluetooth pois päältä - - - Ei yhteyttä - - - Ladataan *number*% - - - Lataa versio *number* nyt? - - - Alas - - - DS4Windows päivitys saatavilla! - - - DS4Windows ei voi muokata asetuksia täällä. Suljetaan. - - - Muokkaa - - - Palaa - - - Palaa tähän: *button* - - - Paina hiiren 5. näppäintä - - - Nosta hiiren 5. näppäin - - - Klikkaa vaihtaaksesi väri. Perusväri = Musta - - - Tyhjennä HID - - - Tyhjennä HID lukukertojen välissä - - - Ohjain löytyi - - - Paina hiiren 4. näppäintä - - - Nosta hiiren 4. näppäin - - - Täynnä - - - Klikkaa nähdäksesi Sixaxis gyroskoopin tiedot - - - GyroX, oikealle ja vasemmalle - - - GyroY, eteen ja taakse - - - GyroZ, ylös ja alas - - - tunti - - - tuntia - - - Vie hiiren osoitin asetuksen päälle nähdäksesi kuvaksen tai tarkemmat tiedot - - - Jos poistat DS4Windows:in, voit poistaa myös asetukset kansiolinkistä - - - Viive: *number*ms - - - Asennus valmis - - - Asenna ajurit tästä - - - Asennus epäonnistui, kokeile uudelleen - - - Asennetaan... - - - Käytä Sixaxista auttamaan koskestuslevyn kalibroinnissa - - - Pidä ikkunan koko sulkemisen jälkeen - - - Ohjain *number* viive alle 10ms - - - Ohjain *number* viive yli 10ms - - - Käynnistä *program* - - - Himmennä valo jos ohjain ei ole käytössä - - - Ladataan... - - - Lataa *profile* - - - Macro - - - Uusi profiili - - - N/A - - - Uusi - - - Macroa ei nauhoitettu - - - (tyhjä) - - - tyhjä - - - Profiilia ei ladattu - - - Ohjain *number* profiilia ei ole käytössä - - - Ei kelpaa - - - Avataan asennusohjelmaa - - - Avaa ScpDriver.exe - - - , muut tiedostot poistetaan - - - Lataa päivitysohjelma nyt, siirrä se asennuskansioon ja tarkista päivitykset uudelleen - - - Tuo tai tee uusi profiili - - - Uusi profiili - - - *Profile name* ei voitu palauttaa - - - Profiilikansio siirrettiin ohjelmakansioon - - - Ohjelmat - - - KOKEELLINEN: Kytke Bluetooth automaattisesti pois kun ohjain liitetään USB:hen - - - Sinun täytyy poistua ohjelmista kuten Steam/Uplay ennenkuin aktivoit "piilota DS4-ohjain2" asetuksen - - - Nauhoita - - - Klikkaa hiiren oikealla napilla nähdäksesi esimääritellyt ohjainasetukset - - - Tallenna macro? - - - Scan code - - - Etsitään ohjaimia... - - - Valitse toiminto *action*lle - - - Aseta aktivointipainike - - - Aseta poiskytkentäpainike - - - Pikakuvakkeet - - - Klikkaa lisätietoja Sixaxiksesta - - - Käynnistetään - - - Käynnistä - - - Kohta 1: Asenna DS4 ajuri - - - Lopeta - - - Lopeta - - - DS4Windows suljettiiin - - - DS4 ohjaimet lopetetaan - - - X360 ohjaimet lopetetaan - - - Lopeta - - - Pyyhkäisy alas - - - Pyyhkäisy vasemmalle - - - Pyyhkäisy oikealle - - - Pyyhkäise kosketuslevyä vaihtaaksesi profiilia - - - Hipaisu ylös - - - Osoittimella vetäminen. Pieni viive yksittäisillä napautuksilla. - - - Testaa voimakas - - - Testaa hiljainen - - - Testaa - - - Tekstidokumentti (*.txt) - - - Kallistus alas - - - Kallistus vasemmalle - - - Kallistus oikealle - - - Kallistus ylös - - - Kosketuslevy pois päältä - - - Kosketuslevy päällä - - - Aktivoi uudelleen painamalla PS-näppäintä ja kosketuslevyä - - - 2 sormen pyyhkäisy vasemmalle tai oikealle - - - kirjoita uusi nimi tähän - - - kirjoita profiilin nimi tähän - - - Ei asetettu - - - Ylös - - - Sinulla on viimeisin versio - - - Voit myös vaihtaa kontrolleja suoraan ohjaimella - - - Exclusive mode käytössä - - - Ohjain *number* käyttää profiilia "*Profile name*" - - - Jaettu tila käytössä - - - Kosketuslevy ei toimi hiirenä - - - Aseta kelpaava nimi - - - Odota *number*ms - - - Pidetään - - - Käytä suurempaa porttinumeroa jos ohjelma ei toimi muiden X360 emulointiohjelmien kuten SCP toolin kanssa. - - - XML-tiedostot (*xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.fr-FR.resx b/DS4Windows/Properties/Resources.fr-FR.resx deleted file mode 100644 index fba058b234..0000000000 --- a/DS4Windows/Properties/Resources.fr-FR.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Le nom de cette action existe déja - - - Ajout à la liste... - - - Ajouter des Programmes - - - Un emplacement doit être choisi pour continuer - - - Toujours Mode Arc-en-ciel - - - Assigner à la Manette *number* - - - Batterie: *number*% - - - Conseillé d'utiliser avec le côté droit telle une souris - - - Parcourir... - - - Écriture impossible ici. Copier les paramètres vers Appdata? - - - Rechargée - - - Rechargement: *number*% - - - Verifiez la batterie - - - Fermer DS4Windows ? - - - Fermer DS4Windows via l'icone de notification - - - Couleur - - - Couleur selon le % de batterie - - - Connexion... - - - Éditer le Profil de la Manette *number* - - - Faire le Profil de la Manette *number* - - - La manette *Mac address* a été déconnectée ou la connexion a été perdue - - - Copie terminée, merci de relancer DS4Windows et supprimer les paramètres du Répertoire de l'Application - - - Cliquer pour copier la couleur entiere - - - Attention: Ouverture impossible de la DS4 *Mac Address* - - - jour - - - jours - - - Supprimer le profil? - - - Assombrir selon le % de batterie - - - Eteindre les entrées X360 et utiliser seulement DS4 en natif, Cacher ds4 Doit être éteint (uniquement en filaire) - - - Déconnecter Bluetooth - - - Déconnecté - - - Téléchargement *number*% - - - Télécharger la version *number* maintenant ? - - - Bas - - - Mise à jour de DS4Windows disponible ! - - - DS4Windows ne peut editer les paramètres ici, fermeture imminente. - - - Éditer - - - 5ème Bouton de Souris Bas - - - 5ème Bouton de Souris Haut - - - Cliquer pour changer la couleur du clignotement. Noir = couleur par défaut - - - Vider HID - - - Vider la file d'attente HID aprés chaque lecture - - - Manette trouvée: - - - 4ème Bouton de Souris Haut - - - 4ème Bouton de Souris Bas - - - Rempli - - - Cliquer pour voir les valeurs du Gyroscope Sixaxis - - - GyroX, Inclinaison Gauche et Droite - - - GyroY, Inclinaison Avant et Arriere - - - GyroZ, InclinaisonHaut et Bas - - - heure - - - heures - - - Survoler avec la souris pour voir une description ou plus d'infos - - - Si suppression de DS4Windows, vous pouvez supprimer les paramètres en suivant le lien du dossier de profil - - - Input Delay: *number*ms - - - Installation terminée - - - Installer les pilotes ici - - - Installation ... - - - Utiliser Sixaxis pour aider au calcul des mouvements du pavé tactile - - - Garder les dimensions de la fenêtre après fermeture - - - Manette *number* latence inférieure à 10 ms - - - Manette *number* latence supérieure à 10 ms - - - Démarrer *program* - - - Baisser la luminosité lors de la mise en veille - - - Chargement... - - - Charger *profile* - - - Macro - - - Créer un nouveau profil - - - N/A - - - Nouveau - - - Aucune macro enregistrée - - - (aucun) - - - aucun - - - Pas de profil chargé - - - Manette *number* n'a pas de profile - - - Invalide - - - Ouverture de l'installateur - - - Veuillez ouvrir ScpDriver.exe - - - , les fichiers à un autre endroit seront effacés - - - Veuillez télécharger le centre de mises à jour maintenant, placer le dans le dossier de l'application, puis vérifier de nouveau la disponibilité d'une mise à jour - - - Veuillez importer ou créer un profil - - - Nouveau Profile - - - *Profile Name* ne peut être restauré - - - Dossier du Profil déplacé vers le dossier contenant l'application - - - Programmes - - - EXPERIMENTAL : Déconnexion automatique du BT lors du branchement d'un cable USB - - - Vous devez quitter les autres applications telles que Steam, Uplay avant d'activer l'option "Cacher la manette DS4" - - - Enregistrer - - - Click droit pour choisir les pré-réglages d'une série de contrôles - - - Sauvegarder le macro enregistré? - - - Scannez le code - - - Cherche des manettes... - - - Sélectionner une action pour *action* - - - Raccourcis - - - Cliquer pour les valeurs avancées du Sixaxis - - - Ouverture... - - - Démarrer - - - Étape 1: Installez les pilotes DS4 - - - Arrêtez fort - - - Arrêtez léger - - - Arrêt de DS4Windows - - - Arrêt des manettes DS4 - - - Arrêt des manettes X360 - - - Arrêter - - - Glisser vers le bas - - - Glisser vers la gauche - - - Glisser vers la droite - - - Glisser sur la pavé tactile pour changer de profil - - - Glisser vers le haut - - - Appuyer et maintenir pour glisser, léger retard avec les simples pressions - - - Test fort - - - Test léger - - - Tilt Bas - - - Tilt Gauche - - - Tilt Droite - - - Tilt Haut - - - Reconnaissance de mouvement du pavé tactile est Désactivée - - - Reconnaissance de mouvement du pavé tactile est Activée - - - Relancez en appuyant sur PS + Pavé tactile - - - Glisser avec 2 doigts gauche ou droit sur le pavé tactile - - - écrire un nouveau nom ici - - - écrire un nom de profil ici - - - Haut - - - Votre version de DS4Windows est à jour - - - Vous pouvez également utiliser votre manette pour modifier les touches - - - Utilisation du mode Exclusif - - - La manette *number* utilise le profil "*Profile name*" - - - Utilisation du mode Partagé - - - Désactivation du pavé tactile comme souris - - - Veuillez insérer un nom valide - - - Attendre *number**ms* - - - Sera Garder - - - Arrêt de DS4Windows - - - Document Text (*.txt) - - - Fichiers XML (*.xml) - - - Impossible de deplacer les fichiers, Renommez le dossier DS4Tool à "DS4Windows" - - - Recharger la batterie - - - Retourner - - - Retourner a "bouton" - - - Installation échouée, Veuillez Réessayer - - - Definir Gachette Normale - - - Definir Gachette Decharger - - - Test - - - Non Assigner - - - Utilisez des ports plus hauts si vous rencontrer des conflits avec d'autres programmes, tels que l'outil SCP - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.he.resx b/DS4Windows/Properties/Resources.he.resx deleted file mode 100644 index f36bc1002a..0000000000 --- a/DS4Windows/Properties/Resources.he.resx +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - שם הפעולה כבר קיים - - - הוספה לרשימה... - - - הוסף תוכניות - - - הוסף מיקום כדי להמשיך - - - תמיד במצב צבעוני - - - הגדר בבקר *number* - - - סוללה: %*number* - - - הצד הימני בשימוש הכי טוב עם פעולת עכבר - - - דפדף... - - - אין אפשרות להעביר את הקבצים למיקום החדש. שנה את שם ה-DS4Tool ל-"DS4Windows" - - - אין אפשרות לכתוב את המיקום הנוכחי. להעתיק הגדרות ל-%AppData%? - - - שנה את הסוללה - - - שונה - - - טוען: %*number* - - - בדוק מצב סוללה - - - לסגור את DS4Windows? - - - סגור את DS4Windows באמצעות סמל ההתראה - - - צבע - - - צבע לפי אחוזי סוללה - - - מתחבר - - - ערוך פרופיל של בקר *number* - - - צור פרופיל עבור בקר *number* - - - בקר *Mac address* הוסר או נותק - - - ההעתקה הושלמה. הפעל מחדש את DS4Windows והסר את ההגדרות מתיקיית התוכנית - - - לחץ להעתקת הצבע המלא - - - אזהרה: אי אפשר לפתוח את בקר *Mac address* בלעדית - - - יום - - - ימים - - - למחוק פרופיל? - - - תכהה כאשר מצב הסוללה הוא באחוז - - - כבה את קלט בקר ה-Xbox 360 והשתמש רק בקלט של בקר ה-DS4. הסתרת ה-DS4 חייבת להיות כבויה, כלומר הבקר צריך להיות מחובר חוטית - - - נתק Bluetooth - - - נותק - - - מוריד %*number* - - - למטה - - - עדכון זמין עבור DS4Windows - - - DS4Windows לא יכול לערוך את ההגדרות פה. החלון ייסגר - - - ערוך - - - לחץ לשינוי צבע האור. ברירת מחדל = שחור - - - בקר נמצא: - - - מלא - - - שעה - - - שעות - - - העבר את היכבר מעל פריטים כדי לראות את תיאורם - - - אם אתה מסיר את DS4Windows, אתה יכול למחוק את ההגדרות של הפרופיל - - - זמן המתנה בין פקודות: *number* מילישניות - - - התקנה הושלמה - - - תתקין את ההתקנים פה - - - התקנה נכשלה. נסה שוב - - - מתקין... - - - השתמש ב-Sixaxis בכדי לסייע לחישוב תזוזת משטח המגע - - - שמור על גודל החלון לאחר סגירתו - - - מהירות התגובה של בקר *number* היא מתחת 10 מילישניות - - - מהירות התגובה של בקר *number* היא מעל 10 מילישניות - - - פתח את *program* - - - גם, אם זמן השהייה הופעל והגיע למגבלתו, תכהה את האור במשטח - - - טוען... - - - טען *profile - - - צור פרופיל חדש - - - חדש - - - לא הוקלט Macro - - - לא נטענו פרופילים - - - בקר *number* לא משתמש בפרופיל - - - לא תקין - - - פותח התקנה - - - פתח ScpDriver.exe - - - . מיקומי קבצים אחרים יימחקו - - - תוריד את ה-Updater ושים אותו בתיקיית התוכנה. לאחר מכן, בדוק עבור עדכונים שוב - - - ייבא או צור פרופיל - - - צור פרופיל חדש - - - *Profile name* לא יכול להיות משוחזר. - - - תיקיית הפרופיל הועברה לתיקיית התוכנה - - - תוכנות - - - ניסיוני: בטל Bluetooth אוטומטית בעת התחברות ל-USB - - - אתה חייב לסגור תוכנות כמו Steam ו-Uplay לפני הפעלת האפשרות "הסתר בקר" - - - הקלט - - - קליק-ימני בשביל להגדיר תבניות לסטים של מקשים - - - לשמור הקלטת Macro? - - - סרוק קוד - - - מחפש בקרים... - - - בחר פעולה עבור *action* - - - קיצורי דרך - - - לחץ לקריאת Sixaxis מתקדמת - - - מתחיל... - - - התחלה - - - צעד 1: תתקין את התקן ה-DS4 - - - הפסק רטט כבד - - - הפסק אור - - - DS4Windows הופסק - - - מפסיק בקרי DS4 - - - מפסיק בקרי Xbox 360 - - - הפסק - - - החלק למטה - - - החלק שמאלה - - - החלק ימינה - - - החלק על משטח המגע כדי לשנות פרופילים - - - החלק למעלה - - - בשביל לגרור, לחץ והחזק או גע והמתן זמן קצר - - - נסה רטט כבד - - - נסה רטט קל - - - ניסיון - - - מסמך טקסט (txt.*) - - - הטה מטה - - - הטה שמאלה - - - הטה ימינה - - - הטה מעלה - - - תזוזת משטח המגע כבויה - - - תזוזת משטח המגע פעילה - - - הפעל מחדש על-ידי החזקה של מקש ה-PlayStation ובו-זמנית נגיעה במשטח המגע - - - החלק שתי אצבעות ימינה או שמאלה על משטח המגע - - - רשום שם חדש - - - רשום שם פרופיל חדש - - - לא הוגדר - - - מעלה - - - ברשותך גרסת התוכנה העדכנית ביותר - - - באפשרותך להשתמש בבקר בכדי לשנות מקשים - - - באמצעות "מצב בלעדי" - - - בקר *number* משתמש בפרופיל "*Profile name*" - - - משתמש ב"מצב שיתוף" - - - זה מבטל את השימוש במשטח המגע כעכבר - - - הכנס שם תקין - - - חכה *number* מילישניות - - - יישמר - - - תשתמש בפורטים גבוהים יותר במידה ואימולטור של Xbox 360 נתקל בקונפליקט עם תוכנה זו - - - קבצי XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.hu.resx b/DS4Windows/Properties/Resources.hu.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.hu.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.id.resx b/DS4Windows/Properties/Resources.id.resx deleted file mode 100644 index 496f9d4fb6..0000000000 --- a/DS4Windows/Properties/Resources.id.resx +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Versi Terbaru terpasang - - - Controller *number* menggunakan profil "*Profile name*" - - - Masukkan nama yang benar - - - Tunggu *number*ms - - - File XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.it-IT.resx b/DS4Windows/Properties/Resources.it-IT.resx deleted file mode 100644 index 4d6914cd85..0000000000 --- a/DS4Windows/Properties/Resources.it-IT.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Il Nome di questa azione esiste già - - - Aggiungendo alla lista... - - - Aggiungi Programmi - - - Una locazione deve essere scelta per continuare - - - Sempre Modalità Arcobaleno - - - Assegna al Controller *number* - - - Batteria: *number*% - - - Consigliato usare con la parte destra come funzione del mouse - - - Sfoglia... - - - Non è possibile scrivere alla locazione corrente. Copiare le Impostazioni in appdata? - - - Carica - - - In carica: *number*% - - - Chiudere DS4Windows? - - - Chiudi DS4Windows via icona di notifica - - - Colore - - - Colore per % Batteria - - - Collegamento... - - - Modifica Profilo per il Controller *number* - - - Crea Profilo per il Controller *number* - - - Il Controller *Mac address* è stato rimosso oppure ha perso la connessione - - - Copia completa, per favore rilancia DS4Windows e rimuovi le impostazioni dalla Directory del Programma - - - Clicca per copiare il colore - - - Attenzione: Non è stato possibile aprire DS4 *Mac address* esclusivamente - - - giorno - - - giorni - - - Cancellare Profilo? - - - Ottenuare quando % Batteria - - - Spegnere X360 input e usare solo l'input nativo di DS4, nascondi ds4 deve essere disattivato (Solo tramite cavo) - - - Disconnetti BT - - - Disconnesso - - - In Download *number*% - - - Scaricare la Versione *number* ora? - - - Giù - - - Aggiornamento DS4Windows Disponibile! - - - DS4Windows non può modificare le impostazioni qui, Questo verrà ora chiuso - - - Modifica - - - Torna Indietro - - - 5° Pulsante del Mouse Giù - - - 5° Pulsante del Mouse Su - - - Clicka per cambiare il colore del lampeggio. Nero = colore di default - - - Flush HID - - - Flush Coda HID dopo ogni lettura - - - Trovato Controller: - - - 4° Pulsante del Mouse Giù - - - 4° Pulsante del Mouse Su - - - Piena - - - Clicka per vedere readout del Sixaxis Gyro - - - GyroX, Inclinazione Sinistra e Destra - - - GyroY, Inclinazione Avanti e Indietro - - - GyroZ, Inclinazione Su e Giù - - - ora - - - ore - - - Passa sopra le voci per vederne la descrizione o più dettagli - - - Se rimuovi DS4Windows, puoi cancellare le impostazioni seguendo il link alla cartella profilo - - - Ritardo Input: *number*ms - - - Installazione Completata - - - Installa Driver qui - - - Installazione... - - - Usa Sixaxis per aiutare a calcolare i movimenti touchpad - - - Mantieni questa dimensione della finestra dopo la chiusura - - - Lancia *program* - - - Oscura luminosità anche dopo un tempo di inattività se ON - - - Caricamento... - - - Carica *profile* - - - Macro - - - Crea un Nuovo Profilo - - - N/A - - - Nuovo - - - Nessuna macro registrata - - - (nessuno) - - - nessuno - - - Nessun Profilo Caricato - - - Non valido - - - Apertura Installer - - - Per favore Aprire ScpDriver.exe - - - , i file nelle altre cartelle verranno cancellati - - - Per favore Scarica l'Uploader ora, e posizionalo nella cartella del programma, poi controlla per aggiornamenti nuovamente - - - Per favore importa o crea un profilo - - - Nuovo Profilo - - - *Profile name* non può essere ripristinato. - - - Cartella del Profilo spostata nella cartella del programma - - - Programmi - - - SPERIMENTALE: Auto-Disabilita BT quando ci si connette con USB - - - Devi chiudere le altre applicazioni come Steam, Uplay prima di attivare l'opzione 'Nascondi Controller DS4'. - - - Registra - - - Click Destro per impostare presets per un set di controlli - - - Salvare Macro Registrata? - - - Scansiona Codice - - - In cerca di controller... - - - Seleziona un'azione per *action* - - - Imposta Trigger Regolare - - - Imposta Trigger Unload - - - Scorciatoie - - - Clicka per letture avanzate del Sixaxis - - - Inizio... - - - Inizia - - - Passo 1: Installa il Driver DS4 - - - Arresto Pesante - - - Arresto Leggero - - - DS4Windows Arrestato - - - Controller DS4 in arresto - - - X360 Controller in arresto - - - Arresta - - - Swipe Giù - - - Swipe Sinistra - - - Swipe Destra - - - Effettuare Swipe sul Touchpad per cambiare profili - - - Swipe Su - - - Tap e mantenere per trascinare, piccolo ritardo con tap singoli - - - Test Pesante - - - Test Leggero - - - Inclina Giù - - - Inclina a Sx - - - Inclina a Dx - - - Inclina Su - - - Movimenti Touchpad sono ora Disattivati - - - Movimenti Touchpad sono ora Attivati - - - Ri-abilita premendo PS+Touchpad - - - Swipe Touchpad a 2 dita a sinistra o a destra - - - Scrivi nuovo nome qui - - - Scrivi nome profilo qui - - - Su - - - Sei aggiornato - - - Puoi anche usare il tuo controller per cambiare i controlli - - - Utilizzando Modalità Esclusiva - - - Il Controller *number* sta usando il Profilo "*Profile name*" - - - Utilizzando Modalità Condivisa - - - Questo disabilita il Touchpad come mouse - - - Per favore immettere un nome valido - - - Aspetta *number**ms* - - - Mantenere - - - Usa porte più alte se ricevi conflitti in altri programmi emulatori X360, come il tool SCP - - - Latenza del Controller *number* ora inferiore a 10ms - - - Latenza del Controller *number* superiore a 10ms - - - Il Controller *number* non sta utilizzando alcun profilo - - - Controlla Batteria - - - DS4Windows Arrestato - - - Documento di Testo (*.txt) - - - Impossibile spostare i file in un nuova cartella. Rinomina la cartella DS4Tool in "DS4Windows" - - - Carica la Batteria - - - Installazione Fallita. Riprova - - - Test - - - Non Assegnato - - - File XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ja.resx b/DS4Windows/Properties/Resources.ja.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.ja.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ko.resx b/DS4Windows/Properties/Resources.ko.resx deleted file mode 100644 index 76ab615b19..0000000000 --- a/DS4Windows/Properties/Resources.ko.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 이 동작의 이름이 이미 존재합니다 - - - 리스트로 추가.. - - - 프로그램 추가 - - - 진행을 위해선 경로를 지정해야 합니다 - - - 항상 레인보우 모드로 - - - 컨트롤러 *number* 로 지정 - - - 배터리: *number*% - - - 마우스로 오른편 사용시 제일 좋음 - - - 찾아보기 - - - 새로운 경로로 이동할 수 없습니다, DS4Tool 폴더이름를 "DS4Windows"로 바꿔주세요 - - - 현재 경로에 쓸 수 없습니다. 설정을 appdata로 복사 할까요? - - - 배터리 충전 - - - 충전 완료 - - - 충전 중 : *number*% - - - 배터리 체크 - - - DS4Windows를 종료 하시겠습니까? - - - 작업 표시줄 아이콘으로 닫기 - - - - - - 배터리가  %일때 색 - - - 연결중... - - - 컨트롤러 *number* 의 프로파일을 편집 - - - 컨트롤러 *number* 의 프로파일을 만들기 - - - 컨트롤러 *Mac address*가 해제되었거나 연결이 끊겼습니다 - - - 복사 완료, DS4Windows를 다시시작 하시고 프로그램 경로의 세팅을 삭제해 주시기 바랍니다 - - - 선택하여 모든 색을 복사 - - - 주의: DS4 *Mac address*를 단독으로 열 수 없었습니다 - - - - - - - - - 프로파일을 삭제할까요? - - - 배터리 %에 따라 어두워짐 - - - X360 입력을 끄시고 DS4의 기본 입력만 사용해주세요, 숨겨진 DS4는 꺼져있어야 합니다. (무선) - - - 블루투스 연결 해제 - - - 연결 해제됨 - - - 다운로드 중 *number*% - - - 버젼 *number*을 다운로드 할까요? - - - 아래 - - - DS4Windows의 업데이트가 가능합니다! - - - 여기선 DS4Windows의 설정이 불가합니다. 창이 닫힙니다. - - - 편집 - - - 되돌리기 - - - *button*까지 되돌리기 - - - 마우스 5버튼 아래 - - - 마우스 5버튼 위 - - - 눌러서 반짝이는 색을 바꿉니다. 검은색 = 기본 - - - HID 초기화 - - - 매 읽기 후 HID열을 초기화 - - - 컨트롤러 발견함: - - - 마우스 4버튼 아래 - - - 마우스 4버튼 위 - - - 꽉참 - - - 클릭하여 육축 자이로 센서의  정보를 봅니다. - - - 자이로X, 왼쪽 오른쪽 기울기 - - - 자이로Y, 앞 뒤 기울기 - - - 자이로Z, 위 아래 기울기 - - - 시간 - - - 시간 - - - 마우스 포인터를 올려놓아 내용을 봅니다 - - - DS4Windows를 삭제할시, 당신은 다음 프로파일 폴더 링크에서 세팅을 지울 수 있습니다 - - - 입력 지연: *number*ms - - - 설치 완료 - - - 여기에 드라이버를 설치하세요 - - - 설치 실패, 다시 시도해 주세요 - - - 설치중... - - - 육축센서를 통해 터치패드 동작 계산을 도와주세요. - - - 종료 후에도 창 사이즈를 기억함 - - - 컨트롤러 *number*의 지연이 10ms 이하 입니다. - - - 컨트롤러 *number*의 지연이 10ms를 넘었습니다. - - - *program* 실행 - - - 키면 미사용시 라이트도 같이 꺼짐 - - - 로딩중... - - - *profile* 로드 - - - 메크로 - - - 새로운 프로파일 만들기 - - - N/A - - - 새로 만들기 - - - 녹화된 메크로가 없습니다 - - - (없음) - - - 없음 - - - 로드된 프로파일이 없습니다 - - - 컨트롤러 *number*가 프로파일을 사용하고 있지 않습니다 - - - 무효 - - - 인스톨러 여는중 - - - ScpDriver.exe를 실행해주세요 - - - , 다른 경로의 파일은 삭제될 것입니다 - - - 업데이터를 다운해서 프로그램 폴더에 넣은 후 다시 업데이트를 체크해주세요 - - - 들여오기 혹은 프로파일을 만들어주세요 - - - 새로운 프로파일 - - - *Profile name* 은(는) 복원이 불가합니다 - - - 프로파일 폴더가 프로그램 폴더로 욺겨졌습니다 - - - 프로그램 - - - 실험 버전: USB로 연결될때 자동으로 블루투스 연결 해제 - - - DS4 컨트롤러 숨기기' 항목을 실행하기 전 스팀, 유플레이등의 프로그램을 반드시 끄셔야합니다. - - - 녹화 - - - 오른 클릭으로 컨트롤의 프리셋을 정함 - - - 녹화된 메크로를 저장할까요? - - - 코드 스캔 - - - 컨트롤러 검색중... - - - *action*의 동작을 선택하세요 - - - 기본 트리거 설정 - - - 언로드 트리거 설정 - - - 숏컷 - - - 눌러서 고급 육축센서 수치를 봅니다 - - - 시작중... - - - 시작 - - - 첫번째 : DS4 드라이버를 설치한다 - - - 강한 진동 정지 - - - 약한 진동 정지 - - - DS4Windows를 중지했습니다 - - - DS4 Controllers를 중지하는 중 - - - X360 Controllers를 중지하는 중 - - - 중지 - - - 아래로 스와이프 - - - 왼쪽으로 스와이프 - - - 오른쪽으로 스와이프 - - - 터치패드를 스와이프하여 프로파일을 바꿉니다 - - - 위로 스와이프 - - - 탭한 상태로 드래그, 탭할시 약간의 지연이 있습니다 - - - 강한 진동 테스트 - - - 약한 진동 테스트 - - - 테스트 - - - 텍스트 파일 (*.txt) - - - 아래로 기울기 - - - 왼쪽으로기울기 - - - 오른쪽으로 기울기 - - - 위로 기울기 - - - 터치패드 동작이 꺼졌습니다 - - - 터치패드 동작이 켜졌습니다 - - - PS+터치패드를 눌러 다시 활성화 시킵니다 - - - 두 손가락으로 터치패드에서 왼쪽 혹은 오른쪽으로 스와이프 - - - 새로운 이름을 써주세요 - - - 프로파일 이름을 써주세요 - - - 미지정 - - - - - - 이미 최신버전입니다. - - - 당신의 컨트롤러로 컨트롤을 바꿀수도 있습니다. - - - 독립모드 실행 - - - 컨트롤러 *number* 이 프로파일 “*Profile name*" 을 사용하고 있습니다 - - - 공유모드 사용 - - - 이것은 터치패드 마우스 조작을  끕니다. - - - 알맞은 이름을 써주세요 - - - *number*ms동안 기다려주세요 - - - 유지함 - - - 만약 다른 X360 에뮬레이팅 프로그램(예: SCP's tool)과 충돌이 일어난다면 더 높은 포트를 사용해주세요. - - - XML 파일 (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.nl.resx b/DS4Windows/Properties/Resources.nl.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.nl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.pl.resx b/DS4Windows/Properties/Resources.pl.resx deleted file mode 100644 index 325010fed0..0000000000 --- a/DS4Windows/Properties/Resources.pl.resx +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Nazwa tej akcji już istnieje - - - Dodawanie do listy... - - - Dodaj programy - - - Lokalizacja musi zostać wybrana aby kontynuować - - - Zawsze w Trybie Tęczy - - - Przypisz do Kontrolera *numer* - - - Bateria: *numer*% - - - Najlepiej używać prawej strony jako funkcje w myszce - - - Wyszukaj... - - - Nie mozna zapisac w obecnej lokalizacji. Kopiuj ustawienia do "appdata"? - - - Naładowany - - - Ładowanie *number*% - - - Sprawdź baterie - - - Zamknąć DS4Windows? - - - Zamknij zminimalizowane - - - Kolor - - - Kolor baterii % - - - Łączenie... - - - Edytuj profil dla Kontrolera *number* - - - Stwórz profil dla Kontrolera *number* - - - Kontroler *Mac address* został usunięty lub utracił połączenie - - - Kliknij, żeby skopiować pełen kolor - - - Ostrzeżenie: Nie można otworzyć DS4 *Mac address*. - - - dzień - - - dni - - - Usunąć profil? - - - Przyciemnij baterie o % - - - Wyłącz wejście X360 i używaj tylko standardowego wejścia DS4, opcja ukryj ds4 musi zostać wyłączona (tylko przewodowo) - - - Rozłącz Bluetooth - - - Rozłączono - - - Pobieranie *number*% - - - Chcesz teraz pobrać wersję *number*? - - - Dół - - - Dostępna aktualizacja dla DS4Windows! - - - DS4Windows nie może edytować tu ustawień, Okno zostanie zamknięte - - - Edytuj - - - Wycofaj - - - 5 Przycisk Myszy Wciśnięty - - - 5 Przycisk Myszy Puszczony - - - Znaleziono Kontroler: - - - 5 Przycisk Myszy Wciśnięty - - - 5 Przycisk Myszy Puszczony - - - Naładowany - - - Godzina - - - Godziny - - - Opóźnienie wejścia: *number*ms - - - Instalacja zakonczona - - - Zainstaluj tutaj sterowniki - - - Instalacja... - - - Zapamiętaj rozmiar okna po zamknięciu - - - Uruchom *program* - - - Wczytywanie... - - - Wczytaj *profile* - - - Macro - - - Stwórz nowy profil - - - Niedostępne - - - Nowy - - - Nie zapisano makra - - - (brak) - - - brak - - - Nie załadowano profilu - - - Kontroler *number* nie używa profilu - - - Nieprawidłowy - - - Otwieranie instalatora - - - Proszę otworzyć ScpDriver.exe - - - Proszę zimportować lub stworzyć profil - - - Nowy profil - - - *Profile name* nie mógł zostać przywrócony - - - Folder z profilem został przeniesiony do foldera z programem - - - Programy - - - Szybkie ładowanie - - - Zamknij programy takie jak Steam, Uplay przed aktywowaniem opcji "Ukryj kontroler DS4" - - - Nagrywanie - - - Zapisać nagrane Macro? - - - Szukanie kontrolerów... - - - Wybierz działanie dla *action* - - - Skróty - - - Uruchamianie... - - - Start - - - Krok 1: Zainstaluj DS4 Driver - - - Wstrzymaj słabe - - - Zatrzymano DS4Windows - - - Zatrzymano DS4Windows - - - Zatrzymywanie Kontrolerów DS4 - - - Zatrzymywanie Kontrolerów X360 - - - Stop - - - Przesuń w dół - - - Przesuń w lewo - - - Przesuń po panelu dotykowym aby zmienić profil - - - Przesunięcie dwoma palcami na panelu dotykowym w lewo lub prawo - - - Wpisz tutaj nową nazwę - - - Wpisz tutaj nową nazwę profilu - - - Góra - - - Posiadasz najnowszą wersje oprogramowania - - - Możesz także użyć swojego kontrolera aby zmienić sterowanie - - - Tryb wyłączności - - - Kontroler *number* używa profilu "*Profile name*" - - - Zablokowanie używania panelu dotykowego jako myszy - - - Zostanie zachowane - - - Czekaj *number**ms* - - - Kliknij aby uzyskać zaawansowane odczyty Sixaxis - - - Wstrzymaj silne - - - Przesuń w prawo - - - Przesuń w górę - - - Testuj silne - - - Testuj słabe - - - Test - - - Pliki tekstowe (*.txt) - - - Wychyl w dół - - - Wychyl w lewo - - - Wychyl w prawo - - - Wychyl w górę - - - Poruszanie się panelem dotykowym jest teraz WYŁĄCZONE - - - Poruszanie się panelem dotykowym jest teraz WŁĄCZONE - - - Włącz ponownie przez wciśnięcie przycisku PS i panelu dotykowego - - - Nieprzypisany - - - Tryb udostępniania - - - Wpisz prawidłową nazwe - - - Użyj kolejnych portów, jeśli pojawiają się konflikty z innymi programami emulującymi X360 jak SCP's tool - - - Pliki XML (*.xml) - - - Nie można przenieś plików do nowej lokacij, zmień nazwę folderu DS4Tool na "DS4Windows" - - - Ładowanie bateri - - - Kopiowanie kompletne, zrestartuj DS4Windows i usuń ustawienia z folderu programu - - - Cofnij do *przycisk* - - - Kliknij to zmieny koloru diody kontrolera. Czarny = domyślny kolor - - - Instalacja zakończona niepomyślnie, Proszę spróbować ponownie - - - Użyj Sixaxis dla lepszego kalkulowania ruchów touchpada - - - Kontroler *number* opoźnienie poniżej 10ms - - - Kontroler *number* opoźnienei ponad 10ms - - - Macro zapisane - - - Klawisz wielofunkcyjny - - - Wybierz macro - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.pt-BR.resx b/DS4Windows/Properties/Resources.pt-BR.resx deleted file mode 100644 index e33d53330d..0000000000 --- a/DS4Windows/Properties/Resources.pt-BR.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - O nome desta ação já existe - - - A adicionar à Lista... - - - Adicionar Programas - - - Sempre em Modo Arco-Íris - - - Atribuir ao Controlador *number* - - - Bateria: *number*% - - - Melhor usado com o lado direito como função do rato - - - Procurar... - - - Impossivel Copiar Para Local Atual. Copiar para AppData? - - - Carregado - - - A carregar: *number*% - - - Fechar o DS4Windows através do ícone de notificação - - - Cor - - - Cor por % de Bateria - - - A Conectar... - - - Editar Perfil para Controlo *number* - - - Criar Perfil para Controlo *number* - - - Conexão do controlador *Mac address* foi perdida ou removida - - - Cópia completa, por favor reinicie o DS4Windows e elimine as configurações do Diretório do Programa - - - Clicar para copiar a cor - - - Atenção: Não foi possível abrir exclusivamente o *Mac address* do DS4 - - - Dia - - - Dias - - - Eliminar Perfil? - - - Dissipar por % de Bateria - - - Desligue a entrada X360 e use apenas o input nativo do DS4, função de Esconder DS4 deve estar Desligada (Por Cabo apenas) - - - Desconectado - - - A Transferir *number*% - - - Transferir Versão *number* agora? - - - Para Baixo - - - Atualização do DS4Windows Disponível! - - - O DS4Windows não conseguiu editar as definições aqui, isto vai agora fechar - - - Editar - - - 5ª Botão do Rato para baixo - - - 5ª Botão do Rato para cima - - - Despejar HID - - - Controlo Encontrado: - - - 4ª Botão do Rato para baixo - - - 4ª Botão do Rato para cima - - - Cheio - - - hora - - - horas - - - Se remover o DS4Windows, pode apagar as definições seguindo o link da pasta de Perfil - - - Atraso de Entrada: *number*ms - - - Instalação Completa - - - Instalar Drives aqui - - - A instalar... - - - Manter o tamanho da janela após fechar - - - Executar *program* - - - A Carregar... - - - Carregar *profile* - - - Criar um Novo Perfil - - - Não Disponível - - - Novo - - - Nenhum Macro foi Gravado - - - (nenhum) - - - nenhum - - - Nemhum Perfil Carregado - - - Inválido - - - A abrir o Instalador - - - Por favor, abra o ScpDriver.exe - - - Por favor, transfira o Updater agora, coloque-o na pasta Programas e depois procure por atualizações outra vez - - - Por favor, importe ou crie um Perfil - - - *Profile name* não pode ser restaurado. - - - Pasta de Perfil movida para a pasta Programas - - - É necessário sair de outras aplicações, como a Steam ou a Uplay, antes de ativar a opção 'Ocultar o Controlo DS4'. - - - Gravar - - - Clicar com o botão direito do rato para definir padrões para um set de comandos - - - Gravar Macro Gravada? - - - À procura de controlos... - - - Selecione uma ação para *action* - - - Definir Gatilho Regular - - - Definir Gatilho de Descarregar - - - A Iniciar... - - - Iniciar - - - Passo 1: Instalar a Drive do DS4 - - - Parar Vibração Pesada/Forte - - - Parar Vibração Leve/Ligeira - - - O DS4Windows foi parado - - - A parar os Controlos DS4 - - - A parar os Controlos X360 - - - Parar - - - Deslizar no Painel de Toque para mudar Perfis - - - Toque e segure para arrastar, ligeiro atraso com cliques únicos - - - Testar Vibração Pesada/Forte - - - Testar Vibração Leve/Ligeira - - - Inclinar para Baixo - - - Inclinar para a Esquerda - - - Inclinar para a Direita - - - Inclinar para Cima - - - Movimento no Painel de Toque está agora Desligado - - - Movimento no Painel de Toque está agora Ligado - - - Deslize de 2 dedos no Painel de Toque para a Esquerda/Direita - - - Escrever novo nome aqui - - - Escrever Nome de Perfil aqui - - - Cima - - - Está com a versão mais recente - - - Também é possível usar o comando para mudar os controlos - - - A usar o modo Exclusivo - - - Controlo *number* está a usar o Perfil “*Profile name*" - - - A usar o modo Partilhado - - - Por favor, insira um nome válido - - - Por favor, espere *number*ms - - - Manter - - - Novo Perfil - - - Uma localização precisa ser escolhida para continuar - - - Ver Bateria - - - Fechar o DS4Windows? - - - Desconectar BT - - - Clique para mudar a cor da luz de flash. Preto = cor padrão - - - Eixo X, Incinação Esquerda/Direita - - - Eixo Y, Inclinação Frente/Trás - - - Eixo Z, Inclinação Cima/Baixo - - - Passe o rato por cima de itens para visualizar funções e descrições - - - Use o Sixaxis para ajudar a calcular o movimento do Painel de Toque - - - A latência do Controlo *number* está abaixo de 10ms - - - A latência do Controlo *number* está acima de 10ms - - - Macro - - - Controlo *number* não está a usar um Perfil - - - , ficheiros de outras localizações serão eliminados - - - Programas - - - EXPERIMENTAL: Auto-desabilitar o BT quando conectar através de USB - - - Código de digitalização - - - Atalhos - - - DS4Windows Parou - - - Deslizar para Baixo - - - Deslizar para a Esquerda - - - Deslizar para a Direita - - - Deslizar para Cima - - - Documento de Texto (*.txt) - - - Re-habilitar pressionando PS+Painel de Toque - - - Isto desabilita o controle do Painel de Toque como rato - - - Use portas mais altas se houver conflitos com outros programas de emulação de X360, como por exemplo a ferramenta do SCP - - - Impossível mover ficheiros para a nova localização, por favor renomeie a pasta de DS4Tool para DS4Windows - - - Carregar a Bateria - - - Fall Back - - - Fall Back para *button* - - - Despejar Fila de HID depois de cada leitura - - - Clicar para ler sobre o Giroscópio Sixaxis - - - Instalação Falhada, por favor volte a tentar - - - Também diminuir a luz por inactividade quando Ligado - - - Clicar para leitura avançada do Sixaxis - - - Testar - - - Não Atribuído - - - Ficheiros XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.resx b/DS4Windows/Properties/Resources.resx index 2cc05e50bf..ce5408be15 100644 --- a/DS4Windows/Properties/Resources.resx +++ b/DS4Windows/Properties/Resources.resx @@ -117,129 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\mouse.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\rainbow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\rainbowC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4 Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Pairmode.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\shell32_copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\shell32_new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\imageres_new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\BT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\none.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\USB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\imageres_import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\saveprofile.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\A.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\B.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\BACK.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DOWN.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LEFT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSD.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSR.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RIGHT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSD.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSR.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\START.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\UP.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Name of this action already exists - - ..\Resources\Y.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Adding to list... - - ..\Resources\size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Add Programs - - ..\Resources\checked.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + A location must be picked to continue Always Rainbow Mode @@ -253,17 +141,47 @@ Best used with right side as a mouse function + + Browse... + + + Determines the poll rate used for the DS4 hardware when connected via Bluetooth. (Applies on profile save) + + + Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows" + Cannot write at current location. Copy Settings to appdata? + + Charge the battery + Charged Charging: *number*% + + Check Battery + + + This will disconnect all your connected controllers. Proceed? + + + Close DS4Windows? + + + Close DS4Windows via the notification icon + + + Color + - Color by Battey % + Color by Battery % + + + Confirm... Connecting... @@ -296,7 +214,13 @@ Delete Profile? - Dim by Battey % + Dim by Battery % + + + Turn off X360 input and only use the DS4's native input, hide ds4 must be off (Wired Only) + + + Disconnect BT Disconnected @@ -307,24 +231,49 @@ Download Version *number* now? + + Down + + + + ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows Update Available! + + ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows cannot edit settings here, This will now close + + ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Edit + + Fall Back + + + Fall Back to *button* + 5th Mouse Button Down 5th Mouse Button Up + + Click to change flash color. Black = default color + Flush HID + + Flush HID Queue after each reading + Found Controller: @@ -337,24 +286,87 @@ Full + + Click to see readout of Sixaxis Gyro + + + Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active. + + + GyroX, Left and Right Tilt + + + GyroY, Forward and Back Tilt + + + GyroZ, Up and Down Tilt + hour hours + + Hover over items to see description or more about + If removing DS4Windows, You can delete the settings following the profile folder link + + Input Delay: {0:0.##} ms + Install Complete + + Install Drivers here + + + Install Failed, Please Retry + + + Installing... + + + Use Sixaxis to help calculate touchpad movement + + + Keep this window size after closing + + + Language pack change will take effect after DS4Windows application is restarted. + + + Controller *number*'s latency now under 10ms + + + Controller *number*'s latency over 10ms + + + Launch *program* + + + Also dim light by idle timeout if enabled when DS4 is fully charged + Loading... + + Load *profile* + + + Macro + + + Macro Recorded + Make a New Profile + + Mutli-Action Button + N/A @@ -373,6 +385,9 @@ No Profile Loaded + + Controller *number* is not using a profile + Not valid @@ -382,146 +397,116 @@ Please Open ScpDriver.exe + + , other location files will be deleted + - Please Download the Updater now, and place it in the programs folder, then check for update again + Please Download the Updater now, place it in the programs folder and rename to DS4Updater.exe if on x86, then check for update again Please import or make a profile + + New Profile + *Profile name* cannot be restored. Profile Folder Moved to program folder - - You must quit other applications like Steam, Uplay before activating the 'Hide DS4 Controller' option." - - - Save Recorded Macro? - - - Searching for controllers… - - - Select an action for *action* + + Programs - - Starting... + + EXPERIMENTAL: Auto-Disable BT when connecting to USB - - Start + + You must quit other applications like UWP apps (Netflix), Steam, Uplay, NVIDIA IN-GAME before activating the 'Hide DS4 Controller' option. For more info check https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues - - Stopping DS4 Controllers + + Record - - Stopping X360 Controllers + + Right Click to set presets for a set of controls - - Stop + + Tells Windows to start DS4Windows after login - - Swipe Touchpad to change profiles + + Save Recorded Macro? - - Tap and hold to drag, slight delay with single taps + + Scan Code - - Touchpad Movement is now Off + + Searching for controllers... - - Touchpad Movement is now On + + Select an action for *action* - - type new name here + + Select a macro - - type profile name here + + Set Regular Trigger - - You can also use your controller to change controls + + Set Unload Trigger - - Using Exclusive Mode + + Shortcuts - - Using Shared Mode + + Calibration of sixaxis wheel emulation - - Please enter a valid name + + (1) Center the controller, hold it steady and press "X" - - Wait *number*ms + + (2) Turn to 90° left (or right) position and press "X" - - Will Keep + + (3) Turn to 90° right (or left) position and press "X" - - 2 finger touchpad swipe left or right + + All calibraton points are set when lightbar color turns to green. While turning the controller the lightbar color flashes when the controller is at calibration point. Accept calibration with OK button - - You are up to date + + Cannot calibrate gyro (sixaxis) steering wheel emulation values without a controller. Connect a controller via bluetooth or usb - - Adding to list... + + Gyro steering wheel emulation axis option is set to NONE (emulation is not used). Please select an axis option before calibrating the sixaxis gyro steering wheel emulation - - Add Programs - - - Browse... - - - Color - - - Down - - - Input Delay: *number*ms + + Click for advanced Sixaxis reading - - Keep this window size after closing + + Starting... - - Record + + Start - Step 1: Install the DS4 Driver - - - Up - - - Turn off X360 input and only use the DS4's native input, hide ds4 must be off (Wired Only) - - - Install Drivers here - - - Tilt Down + Step 1: Install the ViGEmBus Driver - - Tilt Left - - - Tilt Right + + Stop Heavy - - Tilt Up + + Stop Light - - Installing... + + Stopped DS4Windows - - ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Stopping DS4 Controllers - - ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Stopping X360 Controllers - - Install Failed, Please Retry + + Stop Swipe Down @@ -532,14 +517,14 @@ Swipe Right + + Swipe Touchpad to change profiles + Swipe Up - - Stop Heavy - - - Stop Light + + Tap and hold to drag, slight delay with single taps Test Heavy @@ -547,232 +532,112 @@ Test Light - - EXPERIMENTAL: Auto-Disable BT when conencting to USB - Test - - Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows" - - - Use higher ports if you get conflicts in other emulating X360 programs, such as SCP's tool - - - Name of this action already exists - - - Launch *program* - - - Load *profile* - - - Set Regular Trigger - - - Set Unload Trigger - - - Close DS4Windows via the notification icon - - - Right Click to set presets for a set of controls - - - Disconnect BT - - - New Profile - - - Fall Back to *button* - - - Click to change flash color. Black = default color - - - Flush HID Queue after each reading - - - Click to see readout of Sixaxis Gyro - - - GyroX, Left and Right Tilt - - - GyroY, Forward and Back Tilt - - - GyroZ, Up and Down Tilt - - - Hover over items to see description or more about - - - Use Sixaxis to help calculate touchpad movement + + Text Document (*.txt) - - Also dim light by idle timeout if on + + Tilt Down - - Macro + + Tilt Left - - Programs + + Tilt Right - - Scan Code + + Tilt Up - - Shortcuts + + Touchpad Movement is now Off - - Click for advanced Sixaxis reading + + Touchpad Movement is now On Re-enable by pressing PS+Touchpad - - This disables the Touchpad as a mouse - - - Fall Back - - - A location must be picked to continue + + 2 finger touchpad swipe left or right - - Close DS4Windows? + + type new name here - - , other location files will be deleted + + type profile name here - - ..\Resources\EE.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + You need to run DS4Windows as the Administrator in order to activate this mode. - - Stopped DS4Windows + + Unassigned - - Controller *number*'s latency now under 10ms + + Up - - Controller *number*'s latency over 10ms + + You are up to date - - Controller *number* is not using a profile + + You can also use your controller to change controls - - Check Battery + + Using Exclusive Mode - Controller *number* is using Profile “*Profile name*" - - - Charge the battery - - - ..\Resources\DS4 Config.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Cross.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_L1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_L2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_RS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_ptionss.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_PS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_R1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_R2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_LS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Controller *number* is using Profile "*Profile name*" - - ..\Resources\DS4-Config_Share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Square.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_TouchLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_TouchMulti.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_TouchRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_TouchUpper.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Using Shared Mode - - ..\Resources\DS4-Config_Triangle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + This disables the Touchpad as a mouse - - ..\Resources\DS4-Config_Up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Please enter a valid name - - ..\Resources\DS4 lightbar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Wait *number*ms - - Text Document (*.txt) + + Will Keep XML Files (*.xml) - - Unassigned + + Choose the type of output virtual controller (Applies on profile save) - - ..\Resources\left touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Allow touchpad mouse function to get toggled with PS + Touchpad Click. - - ..\Resources\right touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Enable UDP server. Server listen address and port. Address value options: 127.0.0.1 localhost only | 0.0.0.0 all addresses | Specific host name or IP address. - - ..\Resources\360 highlight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) - - ..\Resources\360 map.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + If enabled then Log tab page shows detailed messages of auto-profile events. - - ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Use a scan code value of keyboard keys in a macro - - Mutli-Action Button + + Run a macro on the trigger key release - - Macro Recorded + + Run multiple macros in synchronized order if the same trigger has several macros (key down macro completed before key release macro is run) - - Select a macro + + Repeat a macro while the trigger key is held down + + + Keep the last key state when macro execution is completed (ie. if a key is left in down state then it is not automatically reset back to default state) + + + Roundness of Square Stick corners \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ro-RO.resx b/DS4Windows/Properties/Resources.ro-RO.resx deleted file mode 100644 index b92cfae753..0000000000 --- a/DS4Windows/Properties/Resources.ro-RO.resx +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Numele acestei acțiuni există deja - - - Se adugă în listă... - - - Adaugă programe - - - O locație trebuie aleasă pentru a continua - - - Modul mereu curcubeu - - - Atribuie manetei *number* - - - Baterie: *number*% - - - Folosit cel mai bine cu partea din dreapta ca funcția de mouse - - - Caută - - - Nu poate fi scris în locația curentă. Copiez setările în appdata? - - - Încărcat - - - Se încarcă - - - Verifică bateria - - - Închide DS4Windows? - - - Închideți DS4Windows prin icoana de notificări - - - Culoare - - - Culoare în funcție de % bateriei - - - Se conectează... - - - Editează profilul pentru maneta *number* - - - Creează profilul pentru maneta *number* - - - Maneta *Mac address* a fost deconectată sau conexiunea a fost pierdută - - - Copiere completă, vă rugăm să deschideți DS4Windows și să ștergeți setările din Program Directory - - - Click pentru a copia întreaga culoare - - - Avertizare: Nu s-a reușit pornirea DS4 *Mac address* în modul exclusiv - - - zi - - - zile - - - Șterge profilul? - - - Întunecă în funție de % bateriei - - - Opriți X360 metodă de introducere și folosiți doar metoda de introducere prestabilită a DS4-ului, ascundeți DS4 trebuie să fie off (Doar pentru Cablu) - - - Deconectare BT - - - Deconectat - - - Descărcare *number*% - - - Doriți descărcarea versiunii *number* acum? - - - Jos - - - Actualizare la DS4Windows disponibilă! - - - DS4Windows nu poate edita setările aici, acum se va închide - - - Editează - - - Rămâi in urma - - - Butonul 5 de pe mouse în jos - - - Butonul 5 de pe mouse Buton în sus - - - Click pentru a schimba culoarea luminării intense. Negru = culoarea implicită - - - Golește HID - - - Golește coada HID după fiecare citire - - - Manetă găsită - - - Butonul 4 de pe mouse în jos - - - Butonul 4 de pe mouse în jos - - - Plin - - - Click pentru a vedea citirea de la giroscopul Sixaxis - - - GyroX, înclinare spre stânga și dreapta - - - GyroY, înclinare în față și în spate - - - GyroZ, înclinare în sus și în jos - - - oră - - - ore - - - Țineți cursorul deasupra obiectelor pentru a vedea o descriere sau mai multe despre - - - Dacă ștergeți DS4Windows, puteți șterge setările urmărind profilul folderului link - - - Întârziere la intrare: *number*ms - - - Instalare completă - - - Instalează drivere-le aici - - - Se instalează... - - - Folosește Sixaxis pentru a ajuta calculul mișcării pe touchpad - - - Păstreză această mărime a ferestrei după închidere - - - Latența manetei *number* este acum sub 10ms - - - Latența manetei *number* este peste 10ms - - - Lansează *program* - - - Se încarcă... - - - Încarcă *profile* - - - Macro - - - Creează un profil nou - - - N/A - - - Nou - - - Niciun Macro nu a fost înregistrat - - - (niciun) - - - niciun - - - Niciun profil încărcat - - - Maneta *number* nu folosește niciun profil - - - Invalid - - - Se deschide programul de instalare - - - Vă rog să deschideți ScpDriver.exe - - - , fișierele din altă locație for fi șterse - - - Vă rog să descărcați Actualizatorul acum, și plasați-l in folderul cu programe, apoi verficați din nou pentru actualizări - - - Vă rog să importați sau creați un profil - - - Profil nou - - - *Profile name* nu poate fi reface - - - Folderul cu profile mutat în folderul programului - - - Programe - - - EXPERIMENTAL: Deazactivare automată a BT la conectarea la USB - - - Înregistrează - - - Click dreapta pentru a seta presetările pentru un set de controale - - - Salvează Macro-ul înregistrat? - - - Scanează codul - - - Caut manete... - - - Selectează o acțiune pentru *action* - - - Setare declanșator normal - - - Setare declanșator de descărcare - - - Scurtături - - - Click pentru citire avansată de la Sixaxis - - - În curs de pornire... - - - Pornește - - - Pasul 1: Instalează driver-ul DS4 - - - Oprește Intens - - - Oprește Slab - - - DS4Windows a fost oprit - - - Se opresc manetele DS4 - - - Se opresc manetele X360 - - - Oprire - - - Glisare în jos - - - Glisare spre stânga - - - Glisare spre dreapta - - - Glisați pe touchpad pentru a schimba profilele - - - Glisare în sus - - - Apasă și ține apăsat pentru a trage, puțină întârziere cu apăsări individuale - - - Testează intens - - - Testează slab - - - Înclinare în jos - - - Înclinare la stânga - - - Înclinare la dreapta - - - Înclinare în sus - - - Mișcare pe touchpad oprită - - - Mișcare pe touchpad pornită - - - Reactivează apăsând PS+Touchpad - - - Glisare spre stânga sau dreapta cu 2 degete pe touchpad - - - scrie noul nume aici - - - scrie numele profilului aici - - - Sus - - - Actualizările sunt la zi! - - - Puteți folosi și maneta pentru a schimba controalele - - - Folosind modul exclusiv - - - Maneta *number* folosește profilul "*Profile name*" - - - Folosind modul partajat - - - Acesta dezactivează touchpad-ul ca mouse - - - Vă rog, introduceți un nume valid - - - Asteaptă *number*ms - - - Se va păstra - - - DS4Windows a fost oprit - - - Înclinare în jos - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ru-RU.resx b/DS4Windows/Properties/Resources.ru.resx similarity index 73% rename from DS4Windows/Properties/Resources.ru-RU.resx rename to DS4Windows/Properties/Resources.ru.resx index deacf82aa3..0c63abe498 100644 --- a/DS4Windows/Properties/Resources.ru-RU.resx +++ b/DS4Windows/Properties/Resources.ru.resx @@ -144,9 +144,18 @@ Обзор… + + Определяет частоту опроса, используемую для оборудования DS4 при подключении через Bluetooth. (Применяется при сохранении профиля) + + + Невозможно переместить файлы в новое место. Пожалуйста переименуйте папку с DS4Tool в "DS4Windows" + Невозможно записать в текущее местоположение. Скопировать настройки в AppData? + + Зарядите батарею + Заряжено @@ -156,6 +165,9 @@ Проверить аккумулятор + + Это действие отключит подключенные контроллеры. Продолжить? + Закрыть DS4Windows? @@ -168,6 +180,9 @@ Цвет от заряда % + + Подтвердить... + Подключение... @@ -202,7 +217,7 @@ Затемнение от заряда % - Выключить режим XInput и использовать только DInput. Настройка "Скрыть контроллер DS4" должна быть выключена! + Отключите ввод X360 и используйте только собственный ввод DS4, скрыть ds4 должно быть отключено (только по проводу) Отключить Bluetooth @@ -219,18 +234,31 @@ Вниз + + + ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Доступна новая версия DS4Windows! + + ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows не может изменить настройки! Это приведёт сейчас к закрытию! + + ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Редактировать Вернуть + + Вернуть на *button* + 5-я кнопка мыши Вниз @@ -256,11 +284,14 @@ 4-я кнопка мыши Вверх - Заряжена + Заряжен Нажмите для просмотра текущих назначений гироскопа + + Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active. + Гиро X, наклон влево и вправо @@ -283,14 +314,17 @@ При удалении DS4Windows, вы можете удалить параметры настройки в папке профиля программы - Задержка ввода: *number*мс + Задержка ввода: {0} мс - Установка завершена! + Установка завершена Установите этот драйвер + + Установка не удалась. Пожалуйста повторите + Установка... @@ -300,6 +334,9 @@ Запоминать размер окна после закрытия + + Выбранный языковой пакет будет применен после перезапуска приложения DS4Windows. + Задержка *number*-го контроллера сейчас меньше 10 мс @@ -310,7 +347,7 @@ Запустить *program* - Также затенять по времени простоя + Также затенять по времени простоя если DS4 полностью заряжен Загрузка... @@ -321,9 +358,15 @@ Макрос + + Макрос записан + Создать новый профиль + + Mutli-Action Button + Н/Д @@ -358,7 +401,7 @@ , старые настройки из другой папки будут удалены - Пожалуйста, скачайте Updater, поместите его в папку с программой и запустите снова + Пожалуйста, скачайте Updater, поместите его в папку с программой, переименуйте в DS4Updater.exe для x86 и снова проверьте наличие обновлений Импортируйте или создайте профиль @@ -379,7 +422,8 @@ Автоотключение Bluetooth при подключении по USB - Перед активацией функции "Спрятать DS4" вы должны выйти из игровых клиентов, таких как Steam, Uplay, Origin и пр. + Перед активацией функции "Спрятать DS4" вы должны выйти из игровых клиентов, таких как Steam, Uplay, Origin и пр. + Подробности на https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues Запись @@ -387,6 +431,9 @@ Правый клик для выбора пресета + + Windows запустит DS4Windows после входа + Сохранить записанный макрос? @@ -399,6 +446,9 @@ Выберите действие для *action* + + Выберите макрос + Назначить регулярный триггер @@ -408,6 +458,27 @@ Ярлыки + + Калибровка эмуляции шестиосного колеса + + + (1) Отцентрируйте контроллер, удерживайте его и нажмите "X" + + + (2) Поверните на 90° влево (или вправо) и нажмите "X" + + + (3) Поверните на 90° вправо (или влево) и нажмите "X" + + + Все точки калибровки устанавливаются, когда цвет светлой полосы становится зеленым. При повороте контроллера цвет индикатора мигает, когда контроллер находится в точке калибровки. Подтвердите калибровку кнопкой ОК + + + Невозможно откалибровать значения эмуляции гироскопического (шестиосного) рулевого колеса без контроллера. Подключите контроллер через Bluetooth или USB + + + Опция оси эмуляции рулевого колеса гироскопа установлена на НЕТ (эмуляция не используется). Пожалуйста, выберите опцию оси перед калибровкой эмуляции шестиосного гироскопа + Нажмите для считывания дополнительных возможностей Sixaxis @@ -462,6 +533,12 @@ Тест. лёгкого + + Проверка + + + Текстовый документ (*.txt) + Накл. вниз @@ -484,7 +561,7 @@ Повторное включение нажатием PS + Touchpad - Проведение двумя пальцами по тачпаду влево или вправо + 2 пальцевый жест по тачпаду влево или вправо введите сюда новое имя @@ -492,6 +569,12 @@ введите сюда имя профиля + + Вам нужно запустить DS4Windows от имени Администратора, чтобы активировать этот режим. + + + Не назначено + Вверх @@ -522,34 +605,40 @@ Удержание - - Используйте иной порт, если у вас возникла проблема с другой программой эмулятора контроллера X360, такой как SCP's tool + + XML-файлы (*.xml) - - Остановлена работа DS4Windows + + Выберите тип выходного виртуального контроллера (Применяется при сохранении профиля) - - Текстовый документ (*.txt) + + Разрешить переключение функции мыши тачпада по нажатию PS + Touchpad. - - Невозможно переместить файлы в новое место. Пожалуйста переименуйте папку с DS4Tool в "DS4Windows" + + Включить сервер UDP. Сервер прослушивает адрес и порт. Параметры значения адреса: 127.0.0.1 только localhost | 0.0.0.0 все адреса | Определенное имя хоста или IP-адрес. - - Зарядите батарею + + ^ ABC = Совпадение в начале строки (^) | ABC $ = совпадение в конце строки ($) | * ABC = Содержит строку (*) - - Вернуть на *button* + + Если этот параметр включен, на вкладке «Журнал» отображаются подробные сообщения о событиях автоматического профиля. - - Установка не удалась. Пожалуйста повторите + + Использовать значение кода сканирования клавиш клавиатуры в макросе - - Не назначено + + Запустить макрос при отпускании триггерной клавиши - - XML-файлы (*.xml) + + Запускать несколько макросов в синхронизированном порядке, если один и тот же триггер имеет несколько макросов (макрос нажатия клавиши завершен до запуска макроса освобождения ключа) - - Проверка + + Повторить макрос, удерживая нажатой триггерную клавишу + + + Сохранять последнее состояние ключа, когда выполнение макроса завершено (т.е. если ключ отключен, он не будет автоматически возвращен в состояние по умолчанию) + + + Округлость квадратного стика \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.sl.resx b/DS4Windows/Properties/Resources.sl.resx deleted file mode 100644 index 19a7433d2b..0000000000 --- a/DS4Windows/Properties/Resources.sl.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ime tega dejanja že obstaja - - - Dodajam k seznamu... - - - Dodaj programe - - - Mesto mora biti izbrano za nadaljevanje - - - Vednno Mavrični način - - - Dodeli Krmilniku *number* - - - Baterija: *number*% - - - Najbolje uporabljeno z desno stranjo, kot funkcijo miške - - - Brskanje... - - - Premik datotek na novo mesto ni mogoč, prosim preimenujte DS4Orodje mapo v "DS4Windows - - - Zapis na trenutnem mestu ni mogoč. Kopiraj nastavitve v podatke aplikacije? - - - Napolnite baterijo - - - Napolnjeno - - - Polnem: *number*% - - - Preglej baterijo - - - Zapri DS4Windows? - - - Zapri DS4Windows preko obvestilne ikone - - - Barva - - - Barva glede na baterijo % - - - Povezujem... - - - Uredi račun za Krmilnik *number* - - - Naredi račun za Krmilnik *number* - - - Krmilnik *Mac adress* je bil odstranjen ali je izgubil povezavo - - - Kopiranje je končano, prosim ponovno zaženite DS4Windows in odstranite nastavitve iz programskega imenika - - - Klik za kopiranje celotne barve - - - Opozorilo: odpiranje *Mac address* izključno ni mogoče - - - dan - - - dni - - - Izbriši račun? - - - Zatemni glede na baterijo % - - - Izklopi X360 vhod in uporabi le DS4-jev vhod, skrij DS4 mora biti izključeno (samo preko USB kabla) - - - Odklopi BT - - - Odklopljeno - - - Prenašam *number*% - - - Prenesi verzijo *number* sedaj? - - - Dol - - - Posodobitev za DS4Windows je na voljo! - - - DS4Windows tukaj ne more urediti nastavitev, to se bo sedaj zaprlo - - - Uredi - - - Pojdi nazaj - - - Pojdi nazaj na *button* - - - 5. gumb miške dol - - - 5. gumb miške gor - - - Klik za spremembo barve bliskanja. Črna = prednastavljena barva - - - Prečisti HID - - - Prečisti HID vrsto po vsakem branju - - - Najden Krmilnik: - - - 4. gumb miške dol - - - 4. gumb miške gor - - - Polno - - - Klik za ogled odčitavanja Sixaxis gyro - - - GyroX, naklon levo in desno - - - GyroY, naklon naprej in nazaj - - - GyroZ, naklon gor in dol - - - ura - - - ur - - - Lebdite nad predmeti, za pojasnitev - - - Ob odstranitvi DS4Windows, lahko izbrišete nastavitve, ki sledijo povezavi z mapo z računi - - - Zakasnitev ob vhodu: *number*ms - - - Namestitev je končana - - - Tukaj namestite gonilnike - - - Namestitev ni uspela; prosim, poskusite ponovno - - - Nameščam... - - - Uporabi SIxaxis za pomoč pri računanju premikanja po Touchpad-u - - - Obdrži to velikost okna po zaprtju - - - Krmilnik *number*-ova zakasnitev je sedaj pod 10ms - - - Krmilnik *number* - - - Zaženi *program* - - - Tudi zatemnjena luč ob nedejavnosti, če vključeno - - - Nalagam... - - - Naloži *profile* - - - Macro - - - Naredi nov račun - - - N/A - - - Nov - - - Noben Macro ni bil zapisan - - - (noben) - - - noben - - - Ni naloženega računa - - - Krmilnik *number* ne uporablja računa - - - Ni veljavno - - - Odpiram program za namestitev - - - Prosim odprite ScpDriver.exe - - - , druga mesta datotek bodo izbrisana - - - Prosim prenesite Posodobljevalnik in ga namestite v mapo z programi, nato spet preglejte za posodobitev - - - Prosim uvozite ali naredite račun - - - Nov račun - - - *Profile name* ne more biti obnovljen - - - Mapa z računi premaknjena v mapo z programi - - - Programi - - - EKSPERIMENTALNO: Auto-onemogoči BT, ko je povezan USB kabel - - - Potreben je izhod iz drugih aplikacij, kot je Steam ali Uplay pred aktiviranjem 'Skrij DS4 Krmilnik' možnosti." - - - Zapis - - - Desni klik za prednastavitev za vse Krmilnike - - - Shrani zapisani Macro? - - - Skeniraj kodo - - - Iskanje Krmilnikov... - - - Izberi dejanje za *action* - - - Nastavi navaden sprožilec - - - Nastavi sprožilec za odnaložitev - - - Bližnjice - - - Klik za napredno Sixaxis branje - - - Zaganjam.. - - - Zaženi - - - Prvi korak: Namesti DS4 gonilnik - - - Ustavi težko - - - Ustavi lahko - - - Ustavitev DS4 Windows - - - Ustavljanje DS4 Krmilnikov - - - Ustavljanje X360 Krmilnikov - - - Ustavi - - - Podrsaj dol - - - Podrsaj levo - - - Podrsaj desno - - - Podrsaj po Touchpad-u za zamenjavo računa - - - Podrsaj gor - - - Pritisni in drži za povlek, krajša zamuda z enojnimi pritiski na gumb - - - Preizkusi težko - - - Preizkusi lahko - - - Preizkus - - - Besedni dokument (*.txt) - - - nagibaj dol - - - Nagibaj levo - - - Nagibaj desno - - - Nagibaj gor - - - Touchpad premikanje je onemogočeno - - - Touchpad premikanje je omogočeno - - - Ponovno omogoči s pritiskom PS+Touchpad - - - 2 prsta na Touchpad-u podrsaj levo ali desno - - - Sem vtipkajte novo ime - - - Sem vtipkajte ime računa - - - Nedefinirano - - - Gor - - - Posodobljeni ste - - - Lahko uporabiš Krmilnik za zamenjanje barv - - - Uporabljam ekskluziven način - - - Krmilnik *number* uporablja račun *Profile name* - - - Uporabljam način skupne uporabe - - - To onemogoči Touchpad, kot miško - - - Prosim vstavite veljavno ime - - - Počakaj *number*ms - - - Bo še naprej - - - Uporabi višje vhode, če se pojavi odpor z drugimi X360 posnemalnimi programi, kot je SCP-jevo orodje - - - XML Datoteke (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.sv.resx b/DS4Windows/Properties/Resources.sv.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.sv.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.tr.resx b/DS4Windows/Properties/Resources.tr.resx deleted file mode 100644 index a020175f76..0000000000 --- a/DS4Windows/Properties/Resources.tr.resx +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bu eylem için yazdığınız isim zaten mevcut - - - Listeye ekleniyor... - - - Program Ekle - - - Devam etmek için bir konum seçilmelidir. - - - Kalıcı Gökkuşağı Modu - - - *number* 'a Kolu Ata - - - Pil Durumu: %*number* - - - Sağ tarafı en verimli fare işlevi olarak kullanın - - - Gözat... - - - Geçerli konuma yazılamıyor. Ayarlar appdata'ya kopyalansın mı? - - - Şarj oldu - - - Şarj oluyor %*number* - - - Pili Kontrol Et - - - DS4Windows'u kapat? - - - DS4Windows'u bildirim ikonundan kapat - - - Renk - - - Pil yüzdesine göre renk - - - Bağlanıyor... - - - Kol *number* Için Profili Düzenle - - - Kol *number* Için Profil Oluştur - - - *Mac address* adresli kol çıkarıldı veya bağlantısı koptu - - - Kopyalama tamamlandı, lütfen DS4Windows'u yeniden başlatın ve program klasöründen ayarları silin - - - Rengi kopyalamak için tıklayın - - - Uyarı: Sadece DS4 *Mac address* açılamıyor. - - - Gün - - - Gün - - - Profili Sil? - - - Pil durumuna göre ışığı karar - - - X360 girişini kapatın ve sadece DS4'e özgü girişi kullanın, DS4'ü gizleme kapalı olmalı(Yalnızca Kablolu Bağlantı İçin) - - - BT bağlantısını kopar - - - Bağlantı Koptu - - - İndiriliyor %*number* - - - Versiyon *number* şimdi indirilsin mi? - - - Asağı - - - DS4Windows Güncellemesi Mevcut! - - - DS4Windows burda ayarlarınızı düzenleyemiyor. Bu pencere şimdi kapanacak. - - - Dznl - - - Geri Düşme - - - 5. Fare Butonu Aşağı - - - 5. Fare Butonu Yukarı - - - Yanıp Sönen rengi değiştirmek için tıkla. Siyah = varsayılan renk - - - Boş HID - - - HID sırasını her okumadan sonra boşalt - - - Bulunan Kol: - - - 4. Fare Butonu Aşağı - - - 4. Fare Butonu Aşağı - - - Dolu - - - Sixaxis Gyro çıktısını görmek için tıkla - - - GyroX, Sola ve Sağa yatır - - - GyroY, İleri ve Geri yatır - - - GyroZ, Yukarı ve Aşağı eğ - - - Saat - - - Saat - - - Açıklama görmek için için fareyi seçenekler üstünde tutun - - - Eğer DS4Windows'u kaldırıyorsanız, profil klasöründen ayarları silebilirsiniz - - - Girdi Gecikmesi: *number*ms - - - Kurulum Tamamlandı - - - Driverları Kur - - - Kuruluyor - - - Touchpad hareketinin hesaplanmasına yardımcı olmak için Sixaxis kullan - - - Bu pencere boyutunu hatırla - - - *number* numaralı kolun gecikmesi 10ms'ten az - - - *number* numaralı kolun gecikmesi 10ms'ten fazla - - - Şunu başlat: *program* - - - Ayrıca ışığı şu kadar süre boşta kalırsa karart: - - - Yükleniyor... - - - Şunu yükle: *profile* - - - Makro - - - Yeni Profil Oluştur - - - Kullanılamaz - - - Yeni - - - Hiç makro kayıt edilmedi - - - (hiç) - - - hiç - - - Hiçbir profil yüklenmedi - - - Kol *number* bir profil kullanmıyor - - - Geçerli değil - - - Kurucu Açılıyor - - - Lütfen ScpDriver.exe'yi açınız - - - , diğer konular silinecektir - - - Lütfen Şimdi Güncelleyiciyi indirin ve programlar klasörüne kaydedin ardından tekrar güncelleme için kontrol edin. - - - Lütfen bir profili içeri aktarın veya yeni bir tane oluşturun - - - Yeni Profil - - - *Profil name* onarılamadı. - - - Pofil Klasörü program klasörüne taşındı. - - - Programlar - - - DENEYSEL: BT bağlantısını kablo takılırsa otomatik olarak devre dışı bırak - - - DS4'ü Gizle' opsiyonunu aktif hale getirmeden önce Steam, Uplay gibi uygulamalardan çıkış yapmalısınız. - - - Kayıt - - - Sağ tıklayarak kontrol önayarlarını seçiniz - - - Makroyu kaydet? - - - Tarama Kodu - - - Kol aranıyor... - - - *action* için bir eylem seç - - - Normal tetiğe ayarla - - - Boş tetiğe ayarla - - - Kısayollar - - - Gelişmiş Sixaxis çıktısı için tıklayın - - - Başlıyor... - - - Başla - - - Adım 1: Driver'ı yükle - - - Ağır Durdur - - - Hafif Durdur - - - DS4Windows durduruluyor - - - DS4 Kolu durduruluyor - - - x360 Kolu durduruluyor - - - Durdur - - - Asağı Kaydır - - - Sola Kaydır - - - Sağa Kaydır - - - Profiller arası geçiş için touchpad'de kaydır - - - Yukarı Kaydır - - - Uzun basarak sürükle, kısa aralıklarla tek tıkla - - - Ağır Test - - - Hafif Test - - - Aşağı Eğ - - - Yukarı Eğ - - - Sağa Yatır - - - Sola Yatır - - - Touchpad Hareketi şuan Kapalı - - - Touchpad Hareketi şuan Açık - - - PS+Touchpad kombinasyonu ile yeniden etkinleştir - - - Touchpad'de 2 Parmak ile sağa yada sola kaydır - - - Yeni ismi buraya yazın - - - Profil ismini buraya yazın - - - Yukarı - - - Güncelsiniz - - - Kolu kontrölleri değiştirmek için de kullanabilirsiniz - - - Özgün Mod Kullanılıyor - - - Kol *number* "*Profil name*" adlı profili kullanıyor - - - Paylaşımlı Mod Kullanılıyor - - - Bu touchpadi etkisizleştiri - - - Lütfen geçerli bir isim girin - - - *number*ms bekleyin - - - Hatırlanacak - - - Eğer X360 programları ile çakışmalar yaşıyorsanız, SCP's Tool gibi, daha yüksek portları kullanın. - - - DS4Windows durduruluyor - - - Aşağı Eğ - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.uk.resx b/DS4Windows/Properties/Resources.uk.resx deleted file mode 100644 index 80ccf33a12..0000000000 --- a/DS4Windows/Properties/Resources.uk.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ім'я для цієї дії вже існує - - - Додавання до списку... - - - Додати програми - - - Для продовження потрібно вказати місцезнаходження - - - Завжди режим Веселки - - - Призначити контролеру *number* - - - Батарея: *number*% - - - Найкраще використовувати праву сторону як функцію миші - - - Огляд... - - - Неможливо перемістити файли до нової локації, будь ласка, змініть назву папки DS4Tool на "DS4Windows" - - - Неможливо записати в обране місце. Скопіювати налаштування до appdata? - - - Зарядіть батарею - - - Заряджено - - - Заряджається: *number*% - - - Перевірка батареї - - - Зачинити DS4Windows? - - - Зачинити DS4Windows через значок в треї - - - Колір - - - Колір від заряду батареї - - - Підключення... - - - Редагувати профіль для контролера *number* - - - Створити профіль для контролера *number* - - - Контролер *Mac address* було вилучено або втрачено зв'язок - - - Копіювання завершено, будь ласка перезапустіть DS4Windows і видаліть налаштування з папки програми - - - Клацніть, щоб скопіювати повний колір - - - Застереження: Не вдалося ексклюзивно відкрити DS4 *Mac address*. - - - день - - - днів - - - Видалити профіль? - - - Тьмяніти від заряду батареї - - - Вимкнути X360 керування і залишити лише рідне DS4, приховування DS4 має бути вимкнено (тільки з'єднання кабелем) - - - Відключити BT - - - Відключено - - - Завантаження *number*% - - - Завантажити версію *number*? - - - Вниз - - - DS4Windows наявне оновлення! - - - DS4Windows неможливо налаштувати, це зараз закриється - - - Редагувати - - - Відступити - - - Відступити до *button* - - - 5-та Клавіша миші натиснена - - - 5-та Клавіша миші відпущена - - - Клацніть для зміни кольору мерехтіння. Чорний - за замовчуванням - - - Очистити HID - - - Очистити HID-чергу після кожного читання - - - Знайдено контролер: - - - 4-та Клавіша миші натиснена - - - 4-та Клавіша миші відпущена - - - Повний - - - Клацніть для перегляду зчитування Sixaxis гіроскопу - - - GyroX, гойдання вліво і вправо - - - GyroY, гойдання вперед і назад - - - GyroZ, гойдання вгору і вниз - - - година - - - години - - - Наведіть на речі, щоб побачити опис чи більше інформації - - - При видаленні DS4Windows, ви можете видалити налаштування в папці профілю - - - Затримка введення: *number*мс - - - Встановлення завершено - - - Встановлення драйверів - - - Встановлення не вдалося. Будь ласка, спробуйте знову - - - Встановлення... - - - Використовуйте Sixaxis щоб допомогти вирахувати рухи тачпаду - - - Зберегти розмір вікна після закриття - - - Контролер *number* - частота зараз менша 10мс - - - Контролер *number* - частота більша 10мс - - - Запустити *program* - - - Також тьмяніти якщо тайм-аут простою увімкнено - - - Завантаження... - - - Завантажити *profile* - - - Макрос - - - Створити новий профіль - - - Н/Д - - - Новий - - - Новий макрос було записано - - - (нічого) - - - нічого - - - Ніякого профілю не завантажено - - - Контролер *number* не використовує профіль - - - Не діє - - - Відкриття встановлювача - - - Будь ласка, відкрийте ScpDriver.exe - - - , файли з іншої локації будуть видалені - - - Будь ласка, завантажте оновлювач, помістіть його в папку програми, потім знову перевірте оновлення - - - Будь ласка, імпортуйте або створіть профіль - - - Новий профіль - - - *Profile name* неможливо відновити - - - Папку профілю переміщено до папки програми - - - Програми - - - ЕКСПЕРЕМЕНТАЛЬНО: Автовимкнення BT коли підключається USB - - - Ви повинні спочаткузакрити програми типу Steam, Uplay до того, як активувати опцію "Приховати DS4 контролер" - - - Запис - - - Клацніть правою кнопкою миші, щоб встановити пресети для набору елементів керування - - - Зберегти записаний макрос - - - Сканувати код - - - Пошук контролерів... - - - Виберіть дію для *action* - - - Встановити звичайний перемикач - - - Встановити перемикач відвантаження - - - Значки - - - Клацніть для розширеного читання Sixaxis - - - Початок... - - - Початок - - - Крок 1: Встановлення DS4 драйверу - - - Зупинити Важкий - - - Зупинити Легкий - - - Зупинено DS4Windows - - - Зупинка DS4 контролерів - - - Зупинка X360 контролерів - - - Зупинка - - - Посунути вниз - - - Посунути вліво - - - Посунути вправо - - - Посунути по тачпаді для зміни профілів - - - Посунути вгору - - - Натисніть і утримуйте, щоб перетягнути, торкайтесь з мінливою затримкою. - - - Сильний Тест - - - Слабкий Тест - - - Тест - - - Текстовий документ (*.txt) - - - Нахил вниз - - - Нахил вліво - - - Нахил вправо - - - Нахил вгору - - - Рухи тачпадом вимкнено - - - Рухи тачпадом увімкнено - - - Увімкнути натиском PS+Тачпад - - - Посуньте двома пальцями по тачпаду вліво чи право - - - нове ім'я - - - новий профіль - - - Не призначено - - - Вгору - - - У вас найновіша версія - - - Ви можете використати контролер для зміни кнопок - - - Використання ексклюзивного режиму - - - Контролер *number* використовує профіль "*Profile name*" - - - Використання звичайного режиму - - - Це вимкне використання тачпаду як миші - - - Будь ласка, вкажіть можливе ім'я - - - Чекати *number*мс - - - Тримати - - - Використовуйте вищі порти, якщо ви маєте конфлікти в інших емуляторах X360, наприклад - SCD's tool - - - XML-файли (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.zh-Hant.resx b/DS4Windows/Properties/Resources.zh-Hant.resx deleted file mode 100644 index 281fbd58b2..0000000000 --- a/DS4Windows/Properties/Resources.zh-Hant.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 這個動作的名稱已經存在 - - - 新增至列表... - - - 新增程式 - - - 一定要點選一個位置來繼續 - - - 總是開啟彩虹模式 - - - 指定給控制器 *number* - - - 電池:*number*% - - - 與右側最佳用作滑鼠功能 - - - 瀏覽... - - - 無法寫入目前路徑。 複製設定到 appdata 資料夾? - - - 充電完成 - - - 充電中:*number*% - - - 檢查電量 - - - 關閉 DS4Windows 嗎? - - - 通過通知圖示關閉 DS4Windows - - - 顏色 - - - 顏色依電池 % 變化 - - - 連結中... - - - 編輯控制器 *number* 設定檔 - - - 新增控制器 *number* 設定檔 - - - 控制器 *Mac address* 被移除或失去連結 - - - 點擊複製完整的顏色 - - - 警告: 無法獨占啟用 DS4 *Mac address* - - - - - - - - - 刪除設定檔? - - - 依電池 % 變暗 - - - 關閉 X360 按鍵輸入,只使用 DS4 的原生按鍵輸入,"隱藏DS4控制器" 的選項必須先取消(僅限有線連結) - - - 斷開藍牙 - - - 未連接 - - - 下載中 *number* % - - - 立刻下載版本 *number* ? - - - - - - DS4Windows 有可用的更新! - - - DS4Windows 無法編輯設定檔,將立即關閉 - - - 編輯 - - - 退回 - - - 第 5 滑鼠按鍵 按下 - - - 第 5 滑鼠按鍵 放開 - - - 找到控制器: - - - 第 4 滑鼠按鍵 按下 - - - 第 4 滑鼠按鍵 放開 - - - 滿 - - - 小時 - - - 小時 - - - 輸入延遲: *number* 毫秒 - - - 安裝完成 - - - 在此安裝驅動程式 - - - 安裝中... - - - 關閉後保留目前視窗大小 - - - 啟動 *program* - - - 載入中... - - - 載入 *profile* - - - 巨集 - - - 新增使用者設定檔 - - - - - - 新增 - - - 巨集沒有被錄製 - - - (無) - - - - - - 無載入設定檔 - - - 控制器 *number* 未使用一個設定檔 - - - 無效 - - - 開啟安裝程式 - - - 請開啟 ScpDriver.exe - - - 請匯入或新建一個設定檔 - - - 新設定檔 - - - *Profile name* 無法復原 - - - 設定檔資料夾移動至程式資料夾 - - - 程式 - - - 實驗功能: 自動關閉藍牙當連接到USB時 - - - 您必須在退出其他應用程式,如 Steam、Uplay 後,才能啟用 "隱藏 DS4 控制器" 選項。 - - - 錄製 - - - 儲存錄製的巨集? - - - 搜尋控制器... - - - 選擇一個動作來 *action* - - - 捷徑 - - - 啟動中... - - - 開始 - - - 步驟一:安裝 DS4 驅動程式 - - - 停止微震 - - - DS4Windows 已停用 - - - DS4Windows 已停用 - - - 停止 DS4 控制器中 - - - 停止 X360 控制器中 - - - 停止 - - - 向下滑動 - - - 向左滑動 - - - 滑動觸控板以更換設定檔 - - - 兩指向左或向右滑觸控版 - - - 在此輸入新名稱 - - - 在此輸入設定檔名稱 - - - - - - 目前是最新版本 - - - 你也可以使用你的控制器來改變控制 - - - 使用獨占模式 - - - 控制器 *number* 使用設定檔 “*Profile name*” - - - 這將關閉觸控版當作滑鼠 - - - 請輸入有效的名稱 - - - 等待 *number*毫秒 - - - 複製完成,請重新啟動 DS4Windows 並從程式目錄中刪除設定檔 - - - 點擊改變閃爍色彩。黑色 = 默認顏色 - - - 刷新 HID - - - 每次看完後刷新 HID 佇列 - - - 點擊查看六軸陀螺儀的資料解析 - - - 陀螺儀左右傾 - - - 陀螺儀前後傾 - - - 陀螺儀上下傾 - - - 將滑鼠停到項目上來看說明或更多資訊 - - - 當您刪除 DS4Windows 後,可循使用者設定檔資料夾連結刪除設定 - - - 使用六軸來幫助計算觸摸板運作 - - - 控制器 *number* 的延遲現在小於10毫秒 - - - 控制器 *number* 的延遲大於10毫秒 - - - 假如此設定開啟,閒置時間到了也關閉燈光 - - - ,其他位置上的文件將被刪除 - - - 請下載更新程式,放置在程式資料夾中,然後再次檢查更新 - - - 右鍵點擊來設定預設給一組控制 - - - 掃描代碼 - - - 設定固定的觸發鍵 - - - 設定卸載的觸發鍵 - - - 點擊來閱覽進階的六軸 - - - 停止強震 - - - 向右滑動 - - - 向上滑動 - - - 點擊並按住拖動,單點擊有著輕微的延遲 - - - 測試強震 - - - 文本文檔 (*.txt) - - - 下傾 - - - 左傾 - - - 右傾 - - - 上傾 - - - 觸摸板運作現在是關 - - - 觸摸板運作現在是開 - - - 按 PS + 觸控板來重新啟用 - - - 使用共享模式 - - - 將繼續 - - - 無法移動檔案到新的位置,請重命名 DS4Tool 文件夾為 “DS4Windows” - - - 為電池充電 - - - 退回到 *button* - - - 安裝失敗,請重試 - - - 測試微震 - - - 測試 - - - 未指定 - - - 使用更高的連接埠,如果你跟其他模擬X360的程式遇到衝突,如SCP的工具 - - - XML文件 (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.zh-hans.resx b/DS4Windows/Properties/Resources.zh-hans.resx deleted file mode 100644 index b74cdd354d..0000000000 --- a/DS4Windows/Properties/Resources.zh-hans.resx +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 此操作名已经存在 - - - 添加到列表... - - - 添加程序 - - - 请设置路径以继续 - - - 总是彩虹模式 - - - 分配到手柄 *number* - - - 电量:*number*% - - - 作为鼠标右键最好用的方法 - - - Søg… - - - Kan ikke skrives til nuværende placering. Kopier instillinger til appdata? - - - 充电完毕 - - - 正在充电:*number*% - - - 检查电池 - - - 关闭 DS4Windows 吗? - - - 通过消息栏图标关闭DS4Windows - - - 颜色 - - - 依电量颜色为 - - - 正在连接... - - - 编辑手柄*number*配置文件 - - - 新建手柄*number*配置文件 - - - 手柄*Mac address*已删除或失去连接 - - - 复制完成,请重新启动DS4Windows并从程序目录中删除设置文件 - - - 单击以复制完整颜色 - - - 警告: 无法单独打开DS4*Mac address* - - - - - - - - - 是否删除档案? - - - 依电量调暗 - - - 关闭x360输入只使用DS4原生输入,必须关闭隐藏DS4选项(有线情况下) - - - 断开蓝牙 - - - 断开连接 - - - 下载中*number*% - - - 现在下载*number*版本? - - - - - - DS4Windows 有可用更新! - - - DS4Windows 不能修改此处设定,即将关闭 - - - 编辑 - - - 恢复 - - - 鼠标第5按键按下 - - - 鼠标第5按键弹起 - - - 点击设置闪烁颜色。默认:黑 - - - 清空HID - - - 每次读取后刷新HID队列 - - - 找到控制器 - - - 鼠标第4按键按下 - - - 鼠标第4按键弹起 - - - 充满 - - - 点击查看六轴传感器的读数 - - - X轴,左右倾斜 - - - Y轴,前后倾斜 - - - Z轴,上下倾斜 - - - 小时 - - - 小时 - - - 鼠标指针悬停查看说明 - - - 如果删除DS4windows,你可以点配置文件夹链接删除设置文件 - - - 输入延迟:*number*毫秒 - - - 安装完成 - - - 此处安装驱动 - - - 安装中... - - - 使用六轴传感器帮助计算触摸板运动 - - - 退出后保持窗口尺寸 - - - 手柄*number*的延迟在 10ms(毫秒)以内 - - - 手柄*number*的延迟超过 10ms(毫秒) - - - 运行*program* - - - 空闲时灯条变暗 - - - 加载中... - - - 载入*profile* - - - 宏指令 - - - 新建配置文件 - - - 不可用 - - - 新建 - - - 没有宏文件被录制 - - - (无) - - - - - - 未加载配置文件 - - - 手柄*number*尚未配置 - - - 无效 - - - 打开安装程序 - - - 请打开ScpDriver.exe - - - ,其他路径文件将被删除 - - - 请立即下载更新程序,放在程序所在文件夹,然后检查更新 - - - 请导入或新建配置文件 - - - 新配置文件 - - - *Profile name*无法恢复 - - - 配置文件夹移动到程序文件夹 - - - 程序 - - - 【实验功能】接入USB时自动断开蓝牙 - - - 在激活“隐藏DS4”选项前,你必须退出其他程序例如Steam,Uplay - - - 录制 - - - 右键为一系列操作设定预设 - - - 保存已记录的宏指令吗? - - - 扫描 - - - 搜索手柄 - - - 为*action*选择一个操作 - - - 设置正常按键 - - - 设置处理按键 - - - 快捷键 - - - 点击查看高级六轴参数 - - - 启动中... - - - 开始 - - - 第一步:安装DS4驱动 - - - 停止震动 - - - 停止微震 - - - DS4Windows已停止 - - - DS4Windows已停止 - - - DS4手柄停止中 - - - XBOX 360手柄停止中 - - - 停止 - - - 下滑 - - - 左滑 - - - 右滑 - - - 滑动触摸板以更改配置文件 - - - 上滑 - - - 轻触保持以拖动,单次轻触稍微延迟 - - - 测试震动 - - - 下斜 - - - 下斜 - - - 左斜 - - - 右斜 - - - 上斜 - - - 触摸板移动已经关闭 - - - 触摸板移动已经打开 - - - PS键+触摸板 以重新启用 - - - 触摸板双指左或右滑动 - - - 在此输入新命名 - - - 在此输入配置文件名字 - - - 上斜 - - - 程序已经是最新的 - - - 你也可以用手柄来改变操作 - - - 使用排它模式 - - - 手柄*number*正在使用配置文件*profile name* - - - 使用共享模式 - - - 停止触摸板作为鼠标 - - - 请输入一个有效的名字 - - - 等待*number*毫秒 - - - 将保持 - - - 测试微震 - - - 如果你在其他XBOX 360模拟程序中有冲突,使用更高端口.例如SCP's工具 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Settings.Designer.cs b/DS4Windows/Properties/Settings.Designer.cs index ac3f6fb1f4..cf964ceb65 100644 --- a/DS4Windows/Properties/Settings.Designer.cs +++ b/DS4Windows/Properties/Settings.Designer.cs @@ -8,11 +8,11 @@ // //------------------------------------------------------------------------------ -namespace DS4Windows.Properties { +namespace DS4WinWPF.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.2.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/DS4Windows/Properties/Settings.settings b/DS4Windows/Properties/Settings.settings index 39645652af..033d7a5e9e 100644 --- a/DS4Windows/Properties/Settings.settings +++ b/DS4Windows/Properties/Settings.settings @@ -1,7 +1,7 @@  - + - + \ No newline at end of file diff --git a/DS4Windows/Resources/360 fades.png b/DS4Windows/Resources/360 fades.png index 032d3f60f3..8c699ead69 100644 Binary files a/DS4Windows/Resources/360 fades.png and b/DS4Windows/Resources/360 fades.png differ diff --git a/DS4Windows/Resources/360 highlight.png b/DS4Windows/Resources/360 highlight.png index 629251102a..1086194735 100644 Binary files a/DS4Windows/Resources/360 highlight.png and b/DS4Windows/Resources/360 highlight.png differ diff --git a/DS4Windows/Resources/360 highlight.psd b/DS4Windows/Resources/360 highlight.psd deleted file mode 100644 index 4057e5d92d..0000000000 Binary files a/DS4Windows/Resources/360 highlight.psd and /dev/null differ diff --git a/DS4Windows/Resources/360 map.png b/DS4Windows/Resources/360 map.png index d3e5541a24..6296f4f02e 100644 Binary files a/DS4Windows/Resources/360 map.png and b/DS4Windows/Resources/360 map.png differ diff --git a/DS4Windows/Resources/A.PNG b/DS4Windows/Resources/A.PNG index 466257aa1d..832ad09789 100644 Binary files a/DS4Windows/Resources/A.PNG and b/DS4Windows/Resources/A.PNG differ diff --git a/DS4Windows/Resources/B.png b/DS4Windows/Resources/B.png index 9399fdf482..32b5131cec 100644 Binary files a/DS4Windows/Resources/B.png and b/DS4Windows/Resources/B.png differ diff --git a/DS4Windows/Resources/BACK.png b/DS4Windows/Resources/BACK.png index 16f6f7b0ce..ef4032ad5a 100644 Binary files a/DS4Windows/Resources/BACK.png and b/DS4Windows/Resources/BACK.png differ diff --git a/DS4Windows/Resources/BT.png b/DS4Windows/Resources/BT.png index f94a35dcf8..b0a77e2ab7 100644 Binary files a/DS4Windows/Resources/BT.png and b/DS4Windows/Resources/BT.png differ diff --git a/DS4Windows/Resources/Clock.png b/DS4Windows/Resources/Clock.png deleted file mode 100644 index bf09e3323b..0000000000 Binary files a/DS4Windows/Resources/Clock.png and /dev/null differ diff --git a/DS4Windows/Resources/DOWN.png b/DS4Windows/Resources/DOWN.png index 9240c46e6f..070306fe50 100644 Binary files a/DS4Windows/Resources/DOWN.png and b/DS4Windows/Resources/DOWN.png differ diff --git a/DS4Windows/Resources/DS4 Config.png b/DS4Windows/Resources/DS4 Config.png index 807bee6dd0..7a2eaa1898 100644 Binary files a/DS4Windows/Resources/DS4 Config.png and b/DS4Windows/Resources/DS4 Config.png differ diff --git a/DS4Windows/Resources/DS4 Controller.png b/DS4Windows/Resources/DS4 Controller.png index 43af0acc8f..4bb5789009 100644 Binary files a/DS4Windows/Resources/DS4 Controller.png and b/DS4Windows/Resources/DS4 Controller.png differ diff --git a/DS4Windows/Resources/DS4 lightbar.png b/DS4Windows/Resources/DS4 lightbar.png index eac7853f10..56b96d4fb2 100644 Binary files a/DS4Windows/Resources/DS4 lightbar.png and b/DS4Windows/Resources/DS4 lightbar.png differ diff --git a/DS4Windows/Resources/DS4 old.ico b/DS4Windows/Resources/DS4 old.ico deleted file mode 100644 index 6f5f022cc0..0000000000 Binary files a/DS4Windows/Resources/DS4 old.ico and /dev/null differ diff --git a/DS4Windows/Resources/DS4-Config_Circle.png b/DS4Windows/Resources/DS4-Config_Circle.png index f4913b6cc9..ec90da0108 100644 Binary files a/DS4Windows/Resources/DS4-Config_Circle.png and b/DS4Windows/Resources/DS4-Config_Circle.png differ diff --git a/DS4Windows/Resources/DS4-Config_Cross.png b/DS4Windows/Resources/DS4-Config_Cross.png index 378ca40c41..3c75e2fc11 100644 Binary files a/DS4Windows/Resources/DS4-Config_Cross.png and b/DS4Windows/Resources/DS4-Config_Cross.png differ diff --git a/DS4Windows/Resources/DS4-Config_Down.png b/DS4Windows/Resources/DS4-Config_Down.png index 1ebe5de97f..884760cfde 100644 Binary files a/DS4Windows/Resources/DS4-Config_Down.png and b/DS4Windows/Resources/DS4-Config_Down.png differ diff --git a/DS4Windows/Resources/DS4-Config_L1.png b/DS4Windows/Resources/DS4-Config_L1.png index 58e4f91f36..f1e92b92f1 100644 Binary files a/DS4Windows/Resources/DS4-Config_L1.png and b/DS4Windows/Resources/DS4-Config_L1.png differ diff --git a/DS4Windows/Resources/DS4-Config_L2.png b/DS4Windows/Resources/DS4-Config_L2.png index 0576f1c56e..8120d599af 100644 Binary files a/DS4Windows/Resources/DS4-Config_L2.png and b/DS4Windows/Resources/DS4-Config_L2.png differ diff --git a/DS4Windows/Resources/DS4-Config_LS.png b/DS4Windows/Resources/DS4-Config_LS.png index 7f493a0abb..f9a30cff1b 100644 Binary files a/DS4Windows/Resources/DS4-Config_LS.png and b/DS4Windows/Resources/DS4-Config_LS.png differ diff --git a/DS4Windows/Resources/DS4-Config_Left.png b/DS4Windows/Resources/DS4-Config_Left.png index 1f0b30f2fb..07b172a5be 100644 Binary files a/DS4Windows/Resources/DS4-Config_Left.png and b/DS4Windows/Resources/DS4-Config_Left.png differ diff --git a/DS4Windows/Resources/DS4-Config_PS.png b/DS4Windows/Resources/DS4-Config_PS.png index 39b8529e0d..b2ab33f72f 100644 Binary files a/DS4Windows/Resources/DS4-Config_PS.png and b/DS4Windows/Resources/DS4-Config_PS.png differ diff --git a/DS4Windows/Resources/DS4-Config_R1.png b/DS4Windows/Resources/DS4-Config_R1.png index 9ec47cb280..084b72d135 100644 Binary files a/DS4Windows/Resources/DS4-Config_R1.png and b/DS4Windows/Resources/DS4-Config_R1.png differ diff --git a/DS4Windows/Resources/DS4-Config_R2.png b/DS4Windows/Resources/DS4-Config_R2.png index fafec62d3f..609b1fc89a 100644 Binary files a/DS4Windows/Resources/DS4-Config_R2.png and b/DS4Windows/Resources/DS4-Config_R2.png differ diff --git a/DS4Windows/Resources/DS4-Config_RS.png b/DS4Windows/Resources/DS4-Config_RS.png index 926ccd04ab..840f68ed96 100644 Binary files a/DS4Windows/Resources/DS4-Config_RS.png and b/DS4Windows/Resources/DS4-Config_RS.png differ diff --git a/DS4Windows/Resources/DS4-Config_Right.png b/DS4Windows/Resources/DS4-Config_Right.png index 40d5307a7c..5d33a9ecb9 100644 Binary files a/DS4Windows/Resources/DS4-Config_Right.png and b/DS4Windows/Resources/DS4-Config_Right.png differ diff --git a/DS4Windows/Resources/DS4-Config_Share.png b/DS4Windows/Resources/DS4-Config_Share.png index 58f5d2f0ae..0b2833c55f 100644 Binary files a/DS4Windows/Resources/DS4-Config_Share.png and b/DS4Windows/Resources/DS4-Config_Share.png differ diff --git a/DS4Windows/Resources/DS4-Config_Square.png b/DS4Windows/Resources/DS4-Config_Square.png index 0da65c5dc4..14402c0471 100644 Binary files a/DS4Windows/Resources/DS4-Config_Square.png and b/DS4Windows/Resources/DS4-Config_Square.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchLeft.png b/DS4Windows/Resources/DS4-Config_TouchLeft.png index bb34548c5a..a058cb9c61 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchLeft.png and b/DS4Windows/Resources/DS4-Config_TouchLeft.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchMulti.png b/DS4Windows/Resources/DS4-Config_TouchMulti.png index 60467c9564..d76608f1e1 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchMulti.png and b/DS4Windows/Resources/DS4-Config_TouchMulti.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchRight.png b/DS4Windows/Resources/DS4-Config_TouchRight.png index ea321ceaac..e231006f99 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchRight.png and b/DS4Windows/Resources/DS4-Config_TouchRight.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchUpper.png b/DS4Windows/Resources/DS4-Config_TouchUpper.png index 7e3dd283e2..73555cf953 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchUpper.png and b/DS4Windows/Resources/DS4-Config_TouchUpper.png differ diff --git a/DS4Windows/Resources/DS4-Config_Triangle.png b/DS4Windows/Resources/DS4-Config_Triangle.png index c730dcd50f..42d7c219cb 100644 Binary files a/DS4Windows/Resources/DS4-Config_Triangle.png and b/DS4Windows/Resources/DS4-Config_Triangle.png differ diff --git a/DS4Windows/Resources/DS4-Config_Up.png b/DS4Windows/Resources/DS4-Config_Up.png index 7d3dbdee11..d50cfed664 100644 Binary files a/DS4Windows/Resources/DS4-Config_Up.png and b/DS4Windows/Resources/DS4-Config_Up.png differ diff --git a/DS4Windows/Resources/DS4-Config_options.png b/DS4Windows/Resources/DS4-Config_options.png new file mode 100644 index 0000000000..0b2833c55f Binary files /dev/null and b/DS4Windows/Resources/DS4-Config_options.png differ diff --git a/DS4Windows/Resources/DS4-Config_ptionss.png b/DS4Windows/Resources/DS4-Config_ptionss.png deleted file mode 100644 index f8472329bb..0000000000 Binary files a/DS4Windows/Resources/DS4-Config_ptionss.png and /dev/null differ diff --git a/DS4Windows/Resources/DS4.ico b/DS4Windows/Resources/DS4.ico index 3c1b36488d..475dfff6ec 100644 Binary files a/DS4Windows/Resources/DS4.ico and b/DS4Windows/Resources/DS4.ico differ diff --git a/DS4Windows/Resources/DS4W - White.ico b/DS4Windows/Resources/DS4W - White.ico index c7dee8c5dc..1350c675b1 100644 Binary files a/DS4Windows/Resources/DS4W - White.ico and b/DS4Windows/Resources/DS4W - White.ico differ diff --git a/DS4Windows/Resources/DS4W.ico b/DS4Windows/Resources/DS4W.ico index f75e9aa480..cb76226669 100644 Binary files a/DS4Windows/Resources/DS4W.ico and b/DS4Windows/Resources/DS4W.ico differ diff --git a/DS4Windows/Resources/EE.wav b/DS4Windows/Resources/EE.wav deleted file mode 100644 index 8fd4620889..0000000000 Binary files a/DS4Windows/Resources/EE.wav and /dev/null differ diff --git a/DS4Windows/Resources/LB.png b/DS4Windows/Resources/LB.png index 7bb306a71d..f5b89fe057 100644 Binary files a/DS4Windows/Resources/LB.png and b/DS4Windows/Resources/LB.png differ diff --git a/DS4Windows/Resources/LEFT.png b/DS4Windows/Resources/LEFT.png index 6b3af2a4f1..9352692635 100644 Binary files a/DS4Windows/Resources/LEFT.png and b/DS4Windows/Resources/LEFT.png differ diff --git a/DS4Windows/Resources/LS.png b/DS4Windows/Resources/LS.png index 19b2f70e49..c5345164bb 100644 Binary files a/DS4Windows/Resources/LS.png and b/DS4Windows/Resources/LS.png differ diff --git a/DS4Windows/Resources/LSD.png b/DS4Windows/Resources/LSD.png index f0c9c0d7c9..12d4020419 100644 Binary files a/DS4Windows/Resources/LSD.png and b/DS4Windows/Resources/LSD.png differ diff --git a/DS4Windows/Resources/LSL.png b/DS4Windows/Resources/LSL.png index 50b7161503..a42cd5ecb7 100644 Binary files a/DS4Windows/Resources/LSL.png and b/DS4Windows/Resources/LSL.png differ diff --git a/DS4Windows/Resources/LSR.png b/DS4Windows/Resources/LSR.png index 8b6d4bfece..61f1f7755c 100644 Binary files a/DS4Windows/Resources/LSR.png and b/DS4Windows/Resources/LSR.png differ diff --git a/DS4Windows/Resources/LSU.png b/DS4Windows/Resources/LSU.png index c66485280c..6c3ea44bb4 100644 Binary files a/DS4Windows/Resources/LSU.png and b/DS4Windows/Resources/LSU.png differ diff --git a/DS4Windows/Resources/LT.png b/DS4Windows/Resources/LT.png index fa4acc33c2..c272289dbc 100644 Binary files a/DS4Windows/Resources/LT.png and b/DS4Windows/Resources/LT.png differ diff --git a/DS4Windows/Resources/Pairmode.png b/DS4Windows/Resources/Pairmode.png index 8ff4eaae99..aaa61e5ae7 100644 Binary files a/DS4Windows/Resources/Pairmode.png and b/DS4Windows/Resources/Pairmode.png differ diff --git a/DS4Windows/Resources/RB.png b/DS4Windows/Resources/RB.png index 24cc39e5c9..16a31abf70 100644 Binary files a/DS4Windows/Resources/RB.png and b/DS4Windows/Resources/RB.png differ diff --git a/DS4Windows/Resources/RIGHT.png b/DS4Windows/Resources/RIGHT.png index 705f533ad2..a916888571 100644 Binary files a/DS4Windows/Resources/RIGHT.png and b/DS4Windows/Resources/RIGHT.png differ diff --git a/DS4Windows/Resources/RS.png b/DS4Windows/Resources/RS.png index 490b74bbfd..215133a75e 100644 Binary files a/DS4Windows/Resources/RS.png and b/DS4Windows/Resources/RS.png differ diff --git a/DS4Windows/Resources/RSD.png b/DS4Windows/Resources/RSD.png index 3edfe29688..9a477c738d 100644 Binary files a/DS4Windows/Resources/RSD.png and b/DS4Windows/Resources/RSD.png differ diff --git a/DS4Windows/Resources/RSL.png b/DS4Windows/Resources/RSL.png index 5be6c3963e..b0e5d0e910 100644 Binary files a/DS4Windows/Resources/RSL.png and b/DS4Windows/Resources/RSL.png differ diff --git a/DS4Windows/Resources/RSR.png b/DS4Windows/Resources/RSR.png index e178fbacb7..1b9c8deda9 100644 Binary files a/DS4Windows/Resources/RSR.png and b/DS4Windows/Resources/RSR.png differ diff --git a/DS4Windows/Resources/RSU.png b/DS4Windows/Resources/RSU.png index 874c526d74..8a8f19a44b 100644 Binary files a/DS4Windows/Resources/RSU.png and b/DS4Windows/Resources/RSU.png differ diff --git a/DS4Windows/Resources/RT.png b/DS4Windows/Resources/RT.png index 115b05f1f6..fff6cd64cd 100644 Binary files a/DS4Windows/Resources/RT.png and b/DS4Windows/Resources/RT.png differ diff --git a/DS4Windows/Resources/Red Circle.png b/DS4Windows/Resources/Red Circle.png index 84fc5e92f4..5ea845dd4b 100644 Binary files a/DS4Windows/Resources/Red Circle.png and b/DS4Windows/Resources/Red Circle.png differ diff --git a/DS4Windows/Resources/START.png b/DS4Windows/Resources/START.png index c1820b465a..ea5b53ba94 100644 Binary files a/DS4Windows/Resources/START.png and b/DS4Windows/Resources/START.png differ diff --git a/DS4Windows/Resources/Scp_All.ico b/DS4Windows/Resources/Scp_All.ico deleted file mode 100644 index b94efc8ea0..0000000000 Binary files a/DS4Windows/Resources/Scp_All.ico and /dev/null differ diff --git a/DS4Windows/Resources/UP.png b/DS4Windows/Resources/UP.png index c77b541171..32b588b102 100644 Binary files a/DS4Windows/Resources/UP.png and b/DS4Windows/Resources/UP.png differ diff --git a/DS4Windows/Resources/USB.png b/DS4Windows/Resources/USB.png index b0c07bf14c..9c1fbfc073 100644 Binary files a/DS4Windows/Resources/USB.png and b/DS4Windows/Resources/USB.png differ diff --git a/DS4Windows/Resources/UpperTouch.png b/DS4Windows/Resources/UpperTouch.png index 94ee8a2afe..dda8b47107 100644 Binary files a/DS4Windows/Resources/UpperTouch.png and b/DS4Windows/Resources/UpperTouch.png differ diff --git a/DS4Windows/Resources/X.png b/DS4Windows/Resources/X.png index dc92bc6770..5455d28d18 100644 Binary files a/DS4Windows/Resources/X.png and b/DS4Windows/Resources/X.png differ diff --git a/DS4Windows/Resources/Y.png b/DS4Windows/Resources/Y.png index 76f1e0a185..26e9515575 100644 Binary files a/DS4Windows/Resources/Y.png and b/DS4Windows/Resources/Y.png differ diff --git a/DS4Windows/Resources/cancel.png b/DS4Windows/Resources/cancel.png new file mode 100644 index 0000000000..df68a3c745 Binary files /dev/null and b/DS4Windows/Resources/cancel.png differ diff --git a/DS4Windows/Resources/checked.png b/DS4Windows/Resources/checked.png index c059fc26f0..ab731fd154 100644 Binary files a/DS4Windows/Resources/checked.png and b/DS4Windows/Resources/checked.png differ diff --git a/DS4Windows/Resources/clock.png b/DS4Windows/Resources/clock.png new file mode 100644 index 0000000000..2f60d740c2 Binary files /dev/null and b/DS4Windows/Resources/clock.png differ diff --git a/DS4Windows/Resources/copy.png b/DS4Windows/Resources/copy.png new file mode 100644 index 0000000000..029049b709 Binary files /dev/null and b/DS4Windows/Resources/copy.png differ diff --git a/DS4Windows/Resources/delete.png b/DS4Windows/Resources/delete.png index e2d2379e05..2482989b0c 100644 Binary files a/DS4Windows/Resources/delete.png and b/DS4Windows/Resources/delete.png differ diff --git a/DS4Windows/Resources/edit.png b/DS4Windows/Resources/edit.png new file mode 100644 index 0000000000..8e22f35382 Binary files /dev/null and b/DS4Windows/Resources/edit.png differ diff --git a/DS4Windows/Resources/export.png b/DS4Windows/Resources/export.png index 6104cfb0f2..e7293a0a90 100644 Binary files a/DS4Windows/Resources/export.png and b/DS4Windows/Resources/export.png differ diff --git a/DS4Windows/Resources/imageres_import.png b/DS4Windows/Resources/imageres_import.png deleted file mode 100644 index 4245de1c10..0000000000 Binary files a/DS4Windows/Resources/imageres_import.png and /dev/null differ diff --git a/DS4Windows/Resources/imageres_new.png b/DS4Windows/Resources/imageres_new.png deleted file mode 100644 index 7bc1970b83..0000000000 Binary files a/DS4Windows/Resources/imageres_new.png and /dev/null differ diff --git a/DS4Windows/Resources/import.png b/DS4Windows/Resources/import.png new file mode 100644 index 0000000000..80a70eda1e Binary files /dev/null and b/DS4Windows/Resources/import.png differ diff --git a/DS4Windows/Resources/keydown.png b/DS4Windows/Resources/keydown.png new file mode 100644 index 0000000000..2a9209563f Binary files /dev/null and b/DS4Windows/Resources/keydown.png differ diff --git a/DS4Windows/Resources/keyup.png b/DS4Windows/Resources/keyup.png new file mode 100644 index 0000000000..8969f7f08c Binary files /dev/null and b/DS4Windows/Resources/keyup.png differ diff --git a/DS4Windows/Resources/left touch.png b/DS4Windows/Resources/left touch.png index 4c94c3667b..bd5fe1b3e3 100644 Binary files a/DS4Windows/Resources/left touch.png and b/DS4Windows/Resources/left touch.png differ diff --git a/DS4Windows/Resources/mouse.png b/DS4Windows/Resources/mouse.png index 9b3a695732..6aaf93d4a1 100644 Binary files a/DS4Windows/Resources/mouse.png and b/DS4Windows/Resources/mouse.png differ diff --git a/DS4Windows/Resources/newprofile.png b/DS4Windows/Resources/newprofile.png new file mode 100644 index 0000000000..19d4be8371 Binary files /dev/null and b/DS4Windows/Resources/newprofile.png differ diff --git a/DS4Windows/Resources/none.png b/DS4Windows/Resources/none.png index 9e67a44972..6980501e97 100644 Binary files a/DS4Windows/Resources/none.png and b/DS4Windows/Resources/none.png differ diff --git a/DS4Windows/Resources/rainbow.png b/DS4Windows/Resources/rainbow.png index 5ede989a4b..cc717b157e 100644 Binary files a/DS4Windows/Resources/rainbow.png and b/DS4Windows/Resources/rainbow.png differ diff --git a/DS4Windows/Resources/rainbowC.png b/DS4Windows/Resources/rainbowC.png index 0a6f54d7af..94bab13bc1 100644 Binary files a/DS4Windows/Resources/rainbowC.png and b/DS4Windows/Resources/rainbowC.png differ diff --git a/DS4Windows/Resources/rainbowCCrop.png b/DS4Windows/Resources/rainbowCCrop.png new file mode 100644 index 0000000000..38e581e31f Binary files /dev/null and b/DS4Windows/Resources/rainbowCCrop.png differ diff --git a/DS4Windows/Resources/right touch.png b/DS4Windows/Resources/right touch.png index 4e2ac3d54e..3a662f60f0 100644 Binary files a/DS4Windows/Resources/right touch.png and b/DS4Windows/Resources/right touch.png differ diff --git a/DS4Windows/Resources/saveprofile.png b/DS4Windows/Resources/saveprofile.png index 37e3d4bed9..b0b54ae149 100644 Binary files a/DS4Windows/Resources/saveprofile.png and b/DS4Windows/Resources/saveprofile.png differ diff --git a/DS4Windows/Resources/shell32 delete.png b/DS4Windows/Resources/shell32 delete.png deleted file mode 100644 index 009eebc2af..0000000000 Binary files a/DS4Windows/Resources/shell32 delete.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_copy.png b/DS4Windows/Resources/shell32_copy.png deleted file mode 100644 index 5669430bd3..0000000000 Binary files a/DS4Windows/Resources/shell32_copy.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_export.png b/DS4Windows/Resources/shell32_export.png deleted file mode 100644 index 4bb2c2f7bf..0000000000 Binary files a/DS4Windows/Resources/shell32_export.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_new.png b/DS4Windows/Resources/shell32_new.png deleted file mode 100644 index 38a838daa6..0000000000 Binary files a/DS4Windows/Resources/shell32_new.png and /dev/null differ diff --git a/DS4Windows/Resources/size.png b/DS4Windows/Resources/size.png index 3694b39581..c5e2385d90 100644 Binary files a/DS4Windows/Resources/size.png and b/DS4Windows/Resources/size.png differ diff --git a/DS4Windows/Resources/social/bitchute.png b/DS4Windows/Resources/social/bitchute.png new file mode 100644 index 0000000000..f76d3553d6 Binary files /dev/null and b/DS4Windows/Resources/social/bitchute.png differ diff --git a/DS4Windows/Resources/social/bittube.png b/DS4Windows/Resources/social/bittube.png new file mode 100644 index 0000000000..bee88ca2c7 Binary files /dev/null and b/DS4Windows/Resources/social/bittube.png differ diff --git a/DS4Windows/Resources/social/discord.png b/DS4Windows/Resources/social/discord.png new file mode 100644 index 0000000000..929c7a8e1e Binary files /dev/null and b/DS4Windows/Resources/social/discord.png differ diff --git a/DS4Windows/Resources/social/frog_site_logo.png b/DS4Windows/Resources/social/frog_site_logo.png new file mode 100644 index 0000000000..98f20ce66e Binary files /dev/null and b/DS4Windows/Resources/social/frog_site_logo.png differ diff --git a/DS4Windows/Resources/social/lbrylogo.png b/DS4Windows/Resources/social/lbrylogo.png new file mode 100644 index 0000000000..b6d212261f Binary files /dev/null and b/DS4Windows/Resources/social/lbrylogo.png differ diff --git a/DS4Windows/Resources/social/mastodon.png b/DS4Windows/Resources/social/mastodon.png new file mode 100644 index 0000000000..4cf135e908 Binary files /dev/null and b/DS4Windows/Resources/social/mastodon.png differ diff --git a/DS4Windows/Resources/social/minds.png b/DS4Windows/Resources/social/minds.png new file mode 100644 index 0000000000..d22819e12c Binary files /dev/null and b/DS4Windows/Resources/social/minds.png differ diff --git a/DS4Windows/Resources/social/twitter_logo_initial.png b/DS4Windows/Resources/social/twitter_logo_initial.png new file mode 100644 index 0000000000..1fa91f4f48 Binary files /dev/null and b/DS4Windows/Resources/social/twitter_logo_initial.png differ diff --git a/DS4Windows/Resources/social/youtube_social_icon_red.png b/DS4Windows/Resources/social/youtube_social_icon_red.png new file mode 100644 index 0000000000..582a86b4ba Binary files /dev/null and b/DS4Windows/Resources/social/youtube_social_icon_red.png differ diff --git a/DS4Windows/Resources/x360test.png b/DS4Windows/Resources/x360test.png index ac527929b0..5e5d76e6f4 100644 Binary files a/DS4Windows/Resources/x360test.png and b/DS4Windows/Resources/x360test.png differ diff --git a/DS4Windows/Resources/xbox_360_controller.png b/DS4Windows/Resources/xbox_360_controller.png index 86064915e9..fdf974cd55 100644 Binary files a/DS4Windows/Resources/xbox_360_controller.png and b/DS4Windows/Resources/xbox_360_controller.png differ diff --git a/DS4Windows/StartupMethods.cs b/DS4Windows/StartupMethods.cs new file mode 100644 index 0000000000..8fc2ec8802 --- /dev/null +++ b/DS4Windows/StartupMethods.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Win32.TaskScheduler; +using Task = Microsoft.Win32.TaskScheduler.Task; + +namespace DS4WinWPF +{ + [System.Security.SuppressUnmanagedCodeSecurity] + public static class StartupMethods + { + public static string lnkpath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk"; + private static string taskBatPath = Path.Combine(DS4Windows.Global.exedirpath, "task.bat"); + + public static bool HasStartProgEntry() + { + bool exists = File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk"); + return exists; + } + + public static bool HasTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + return tasker != null; + } + + public static bool RunAtStartup() + { + return HasStartProgEntry() || HasTaskEntry(); + } + + public static void WriteStartProgEntry() + { + Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object + dynamic shell = Activator.CreateInstance(t); + try + { + var lnk = shell.CreateShortcut(lnkpath); + try + { + string app = DS4Windows.Global.exelocation; + lnk.TargetPath = DS4Windows.Global.exelocation; + lnk.Arguments = "-m"; + + //lnk.TargetPath = Assembly.GetExecutingAssembly().Location; + //lnk.Arguments = "-m"; + lnk.IconLocation = app.Replace('\\', '/'); + lnk.Save(); + } + finally + { + Marshal.FinalReleaseComObject(lnk); + } + } + finally + { + Marshal.FinalReleaseComObject(shell); + } + } + + public static void DeleteStartProgEntry() + { + if (File.Exists(lnkpath) && !new FileInfo(lnkpath).IsReadOnly) + { + File.Delete(lnkpath); + } + } + + public static void DeleteOldTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + foreach(Microsoft.Win32.TaskScheduler.Action act in tasker.Definition.Actions) + { + if (act.ActionType == TaskActionType.Execute) + { + ExecAction temp = act as ExecAction; + if (temp.Path != taskBatPath) + { + ts.RootFolder.DeleteTask("RunDS4Windows"); + break; + } + } + } + } + } + + public static bool CanWriteStartEntry() + { + bool result = false; + if (!new FileInfo(lnkpath).IsReadOnly) + { + result = true; + } + + return result; + } + + public static void WriteTaskEntry() + { + DeleteTaskEntry(); + TaskService ts = new TaskService(); + TaskDefinition td = ts.NewTask(); + td.Triggers.Add(new LogonTrigger()); + string dir = DS4Windows.Global.exedirpath; + td.Actions.Add(new ExecAction($@"{dir}\task.bat", + "", + dir)); + + td.Principal.RunLevel = TaskRunLevel.Highest; + ts.RootFolder.RegisterTaskDefinition("RunDS4Windows", td); + } + + public static void DeleteTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + ts.RootFolder.DeleteTask("RunDS4Windows"); + } + } + + public static bool CheckStartupExeLocation() + { + string lnkprogpath = ResolveShortcut(lnkpath); + return lnkprogpath != DS4Windows.Global.exelocation; + } + + public static void LaunchOldTask() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + tasker.Run(""); + } + } + + private static string ResolveShortcut(string filePath) + { + Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object + dynamic shell = Activator.CreateInstance(t); + string result; + + try + { + var shortcut = shell.CreateShortcut(filePath); + result = shortcut.TargetPath; + Marshal.FinalReleaseComObject(shortcut); + } + catch (COMException) + { + // A COMException is thrown if the file is not a valid shortcut (.lnk) file + result = null; + } + finally + { + Marshal.FinalReleaseComObject(shell); + } + + return result; + } + } +} diff --git a/DS4Windows/StatusLogMsg.cs b/DS4Windows/StatusLogMsg.cs new file mode 100644 index 0000000000..ab33e11ad5 --- /dev/null +++ b/DS4Windows/StatusLogMsg.cs @@ -0,0 +1,44 @@ +using System; + +namespace DS4WinWPF +{ + public class StatusLogMsg + { + private string message; + private bool warning; + public string Message + { + get => message; + set + { + if (message == value) return; + message = value; + MessageChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler MessageChanged; + + public bool Warning { get => warning; + set + { + if (warning == value) return; + warning = value; + WarningChanged?.Invoke(this, EventArgs.Empty); + ColorChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler WarningChanged; + + public string Color + { + get + { + return warning ? "Red" : "#FF696969"; + } + } + + public event EventHandler ColorChanged; + } +} diff --git a/DS4Windows/Translations/Strings.Designer.cs b/DS4Windows/Translations/Strings.Designer.cs new file mode 100644 index 0000000000..dd2d79bfb8 --- /dev/null +++ b/DS4Windows/Translations/Strings.Designer.cs @@ -0,0 +1,702 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DS4WinWPF.Translations { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4WinWPF.Translations.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Accel. + /// + public static string Accel { + get { + return ResourceManager.GetString("Accel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Action. + /// + public static string Action { + get { + return ResourceManager.GetString("Action", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Directory. + /// + public static string AddDirectory { + get { + return ResourceManager.GetString("AddDirectory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Programs. + /// + public static string AddPrograms { + get { + return ResourceManager.GetString("AddPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Start Menu Programs. + /// + public static string AddStartMenuPrograms { + get { + return ResourceManager.GetString("AddStartMenuPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Steam Games. + /// + public static string AddSteamGames { + get { + return ResourceManager.GetString("AddSteamGames", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All. + /// + public static string All { + get { + return ResourceManager.GetString("All", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto Profiles. + /// + public static string AutoProfiles { + get { + return ResourceManager.GetString("AutoProfiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). + /// + public static string AutoProfPathTip { + get { + return ResourceManager.GetString("AutoProfPathTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). + /// + public static string AutoProfTitleTip { + get { + return ResourceManager.GetString("AutoProfTitleTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Battery. + /// + public static string Battery { + get { + return ResourceManager.GetString("Battery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browse. + /// + public static string Browse { + get { + return ResourceManager.GetString("Browse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browse for Other Programs. + /// + public static string BrowseOtherPrograms { + get { + return ResourceManager.GetString("BrowseOtherPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check For Update Now. + /// + public static string CheckUpdateNow { + get { + return ResourceManager.GetString("CheckUpdateNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check for DS4Windows Updates at Startup. + /// + public static string CheckUpdateStartup { + get { + return ResourceManager.GetString("CheckUpdateStartup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + public static string Clear { + get { + return ResourceManager.GetString("Clear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close Minimizes. + /// + public static string CloseMinimizes { + get { + return ResourceManager.GetString("CloseMinimizes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Color. + /// + public static string Color { + get { + return ResourceManager.GetString("Color", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 1. + /// + public static string Controller1Text { + get { + return ResourceManager.GetString("Controller1Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 2. + /// + public static string Controller2Text { + get { + return ResourceManager.GetString("Controller2Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 3. + /// + public static string Controller3Text { + get { + return ResourceManager.GetString("Controller3Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 4. + /// + public static string Controller4Text { + get { + return ResourceManager.GetString("Controller4Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controllers. + /// + public static string Controllers { + get { + return ResourceManager.GetString("Controllers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Control Panel. + /// + public static string ControlPanel { + get { + return ResourceManager.GetString("ControlPanel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete. + /// + public static string Delete { + get { + return ResourceManager.GetString("Delete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller/Driver Setup. + /// + public static string DriverSetup { + get { + return ResourceManager.GetString("DriverSetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate. + /// + public static string Duplicate { + get { + return ResourceManager.GetString("Duplicate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + public static string Edit { + get { + return ResourceManager.GetString("Edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Action. + /// + public static string EditAction { + get { + return ResourceManager.GetString("EditAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export. + /// + public static string Export { + get { + return ResourceManager.GetString("Export", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full. + /// + public static string Full { + get { + return ResourceManager.GetString("Full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad Test. + /// + public static string GamepadTest { + get { + return ResourceManager.GetString("GamepadTest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gyro. + /// + public static string Gyro { + get { + return ResourceManager.GetString("Gyro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide Unchecked. + /// + public static string HideUnchecked { + get { + return ResourceManager.GetString("HideUnchecked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Import. + /// + public static string Import { + get { + return ResourceManager.GetString("Import", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left Stick. + /// + public static string LeftStick { + get { + return ResourceManager.GetString("LeftStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log. + /// + public static string Log { + get { + return ResourceManager.GetString("Log", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Down. + /// + public static string MoveDown { + get { + return ResourceManager.GetString("MoveDown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Up. + /// + public static string MoveUp { + get { + return ResourceManager.GetString("MoveUp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New. + /// + public static string New { + get { + return ResourceManager.GetString("New", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Action. + /// + public static string NewAction { + get { + return ResourceManager.GetString("NewAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Profile. + /// + public static string NewProfile { + get { + return ResourceManager.GetString("NewProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to None. + /// + public static string None { + get { + return ResourceManager.GetString("None", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path. + /// + public static string Path { + get { + return ResourceManager.GetString("Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile. + /// + public static string Profile { + get { + return ResourceManager.GetString("Profile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile Folder. + /// + public static string ProfileFolder { + get { + return ResourceManager.GetString("ProfileFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quick Charge. + /// + public static string QuickCharge { + get { + return ResourceManager.GetString("QuickCharge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record. + /// + public static string RecordText { + get { + return ResourceManager.GetString("RecordText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + public static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Action. + /// + public static string RemoveAction { + get { + return ResourceManager.GetString("RemoveAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right Stick. + /// + public static string RightStick { + get { + return ResourceManager.GetString("RightStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rumble. + /// + public static string Rumble { + get { + return ResourceManager.GetString("Rumble", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to sec. + /// + public static string RumbleMaxSecs { + get { + return ResourceManager.GetString("RumbleMaxSecs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto stop rumble in secs (0=auto stop disabled). + /// + public static string RumbleMaxSecsTip { + get { + return ResourceManager.GetString("RumbleMaxSecsTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run At Startup. + /// + public static string RunAtStartup { + get { + return ResourceManager.GetString("RunAtStartup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string SaveProfile { + get { + return ResourceManager.GetString("SaveProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + public static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Notifications. + /// + public static string ShowNotifications { + get { + return ResourceManager.GetString("ShowNotifications", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start Minimized. + /// + public static string StartMinimized { + get { + return ResourceManager.GetString("StartMinimized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + public static string StartText { + get { + return ResourceManager.GetString("StartText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Status. + /// + public static string Status { + get { + return ResourceManager.GetString("Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop. + /// + public static string StopText { + get { + return ResourceManager.GetString("StopText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scroll. + /// + public static string TouchScroll { + get { + return ResourceManager.GetString("TouchScroll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Slide. + /// + public static string TouchSlide { + get { + return ResourceManager.GetString("TouchSlide", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap. + /// + public static string TouchTap { + get { + return ResourceManager.GetString("TouchTap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger. + /// + public static string Trigger { + get { + return ResourceManager.GetString("Trigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warnings only. + /// + public static string WarningsOnly { + get { + return ResourceManager.GetString("WarningsOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Window Title. + /// + public static string WindowTitle { + get { + return ResourceManager.GetString("WindowTitle", resourceCulture); + } + } + } +} diff --git a/DS4Windows/Properties/Resources.vi.resx b/DS4Windows/Translations/Strings.cs.resx similarity index 51% rename from DS4Windows/Properties/Resources.vi.resx rename to DS4Windows/Translations/Strings.cs.resx index 9d319e47cf..371930cd4c 100644 --- a/DS4Windows/Properties/Resources.vi.resx +++ b/DS4Windows/Translations/Strings.cs.resx @@ -1,237 +1,315 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cài đặt TĐK tại đây - - - Cài đặt không được. xin thử lại - - - Dang cài đặt - - - Dùng Siaxis để tính toán di chuyển của Touchpad - - - Giữ kích thước cửa sổ khi đóng - - - Độ trễ tay cầm *number* dưới 10ms - - - Độ trễ tay cầm *number* vượt 10ms - - - Chạy *program* - - - Đang chạy... - - - Chạy *profile* - - - Macro - - - Tạo Profile mới - - - Không khả dụng - - - Mới - - - Chưa ghi macro nào - - - (trống) - - - trống - - - Chưa nhập Profile nào - - - Tay cầm *number* không dùng profile nào - - - Không hợp lệ - - - Đang chạy trình cài đặt - - - Vui lòng chạy ScpDriver.exe - - - Vui lòng tải về Updater, và bỏ vào tập tin của chuơng trình, rồi kiểm tra cập nhật lại - - - Vui lòng nhập hoặc tạo một profile - - - Profile mới - - - *Proflide name* không thể phục hồi - - - Chuơng trình - - - Thử nghiệm: Tắt Bluetooth khi kết nối USB - - - Cập nhật mới nhất - - - Bạn cũng có thể dùng tay cầm để thay đổi điều khiển - - - Sử dụng Exclusive Mode - - - Tay cầm - - - Sử dụng Shared Mode - - - Tắt chức năng chuột của Touchpad - - - Nhập tên hợp lệ - - - Chờ *number* pngiây - - - Giữ lại - - - Dùng giao thức cao hơn khi không tuơng thích với các chuơng trình giả lập X360 khác, ví dụ như SCP's tool - - - Tệp XML (*.xml) - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Akcelerace + + + Akce + + + Přidat cestu + + + Přidat programy + + + Přidat ze Start Menu + + + Přidat Steam Hry + + + Vše + + + Automatické profily + + + Baterie + + + Prohlížet + + + Hledat programy + + + Zrušit + + + Hledat aktualizace + + + Hledat aktualizace při startu programu + + + Smazat + + + Zavření minimalizuje + + + Barva + + + Ovladač 1 + + + Ovladač 2 + + + Ovladač 3 + + + Ovladač 4 + + + Ovladače + + + Ovládací panel + + + Odstranit + + + Nastavení ovladače + + + Duplikovat + + + Upravit + + + Upravit akci + + + Exportovat + + + Plná + + + Gyroskop + + + Skrýt nezaškrtnuté + + + Importovat + + + Levá páčka + + + Historie + + + Jméno + + + Nový + + + Nová akce + + + Nový profil + + + Žádné + + + Cesta + + + Profil + + + Složka profilu + + + Rychlé nabíjení + + + Nahrát + + + Odstranit + + + Odstranit akci + + + Pravá páčka + + + Vibrace + + + Spustit při spuštění PC + + + Uložit + + + Uložit profil + + + Nastavení + + + Ukázat upozornění + + + Zapnout minimalizovaně + + + Start + + + Status + + + Stop + + + Přetáčet dotykem + + + Jet dotykem + + + Zmáčknout dotykem + + + Spoušť + + + Jen varování + + + sekunda + + + Automaticky vypnout vibrace po sekundách ( 0 = automatické vypnutí vibrací vypnuto) + \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.el.resx b/DS4Windows/Translations/Strings.es.resx similarity index 54% rename from DS4Windows/Properties/Resources.el.resx rename to DS4Windows/Translations/Strings.es.resx index c60e50306f..85555e34ba 100644 --- a/DS4Windows/Properties/Resources.el.resx +++ b/DS4Windows/Translations/Strings.es.resx @@ -53,7 +53,6 @@ value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. - mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter @@ -117,106 +116,193 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Ανάθεση σε χειριστήριο *number* + + Acelerar + + + Acción + + + Añadir Directorio + + + Añadir Programas + + + Añadir al Menú de Inicio de Programas + + + Añadir Juegos de Steam + + + Todo + + + Perfiles automáticos - Μπαταρία: *number*% + Batería + + + Navegar + + + Navegar en Otros Programas + + + Cancelar + + + Buscar Actualizaciones + + + Buscar Actualizaciones de DS4Windows al Inicio + + + Vaciar + + + Cerrar Minimizado + + + Color + + + Mando 1 - - μέρα + + Mando 2 - - μέρες + + Mando 3 - - Διαγραφή προφιλ; + + Mando 4 - - Αποσυνδεδεμένο Bluetooth + + Mandos - - Αποσυνδεδεμένο + + Panel de Control - - Επεξεργασία + + Eliminar - - Επιστροφή + + Configuración del Mando/Driver - - Επιστροφή στο *button* + + Duplicar + + + Editar + + + Editar Acción + + + Exportar - Πλήρες + Todo - - ώρα + + Gyro - - ώρες + + Ocultar Desmarcado - - Εγκατάσταση... + + Importar - - Φόρτωση... + + Stick Izquierdo - - Διακοπή Φωτισμού + + Registro - - Διακοπή DS4Windows + + Nombre - - Διακοπή DS4 Χειριστηρίου + + Nuevo - - Σταμάτημα Χειριστήριου X360 + + Nueva Acción - - Παύση + + Nuevo Perfil + + + Ninguno + + + Ruta + + + Perfil + + + Directorio del Perfil - - Σύρετε προς τα κάτω + + Cambio Rápido - - Σύρετε προς τα αριστερά + + Guardar - - Σύρετε προς τα δεξιά + + Quitar - - Σύρετε το Touchpad για να αλλάξετε προφίλ + + Quitar Acción - - Σύρετε προς τα πάνω + + Stick Derecho - - Βαριά Δοκιμή + + Vibración - - Ελαφριά Δοκιμή + + Ejecutar al Iniciar el Equipo - - Δοκιμή + + Guardar - - Έγγραφο κειμένου (*.txt) + + Guardar + + + Opciones + + + Mostrar Notificaciones + + + Iniciar Minimizado + + + Iniciar + + + Estado + + + Detener - - Το Touchpad είναι απενεργοποιημένο + + Desplazar - - Το Touchpad είναι ενεργοποιημένο + + Deslizar - - Πάνω + + Pulsar - - Έχετε την τελευταία έκδοση + + Disparador - - Aρχεία XML (*.xml) + + Solo Advertencias - \ No newline at end of file + diff --git a/DS4Windows/DS4Forms/WinProgs.it-IT.resx b/DS4Windows/Translations/Strings.it.resx similarity index 50% rename from DS4Windows/DS4Forms/WinProgs.it-IT.resx rename to DS4Windows/Translations/Strings.it.resx index 6148dcb064..39b2404296 100644 --- a/DS4Windows/DS4Forms/WinProgs.it-IT.resx +++ b/DS4Windows/Translations/Strings.it.resx @@ -1,17 +1,17 @@ - + - - + @@ -117,68 +120,193 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 81, 13 + + Accel - - 241, 22 + + Azione - - 241, 22 + + Aggiungi Cartella - - 241, 22 + + Aggiungi Programmi - - 241, 22 + + Aggiungi al Menu Start - - 242, 92 + + Aggiungi Giochi Steam - - Aggiungi Giochi Origin + + Tutto - - Aggiungi Programmi del Menu Start + + Profili Automatici - - Aggiungi Giochi Steam + + Batteria - - Aggiungi programmi + + Sfoglia - - Rimuovi + + Sfoglia per Altri Programmi - - Nascondi non selezionati + + Cancella - - Salva + + Controlla Aggiornamenti Ora - - Sfoglia per Altri Programmi + + Controlla Aggiornamenti di DS4Windows all'Avvio - + + Svuota + + + Chiudi Minimizza + + + Colore + + Controller 1 - + Controller 2 - + Controller 3 - + Controller 4 - + + Controllers + + + Pannello di Controllo + + + Elimina + + + Configurazione Controller/Driver + + + Duplica + + + Modifica + + + Modifica Azione + + + Esporta + + + Pieno + + + Gyro + + + Nascondi Non-spuntato + + + Importa + + + Analogico Sinistro + + + Registro + + Nome - + + Nuovo + + + Nuova Azione + + + Nuovo Profilo + + + Nessuno + + Percorso - - Scegli Profili qui + + Profilo + + + Cartella del Profilo + + + Carica Rapida + + + Memorizza + + + Rimuovi + + + Rimuovi Azione + + + Analogico Destro + + + Vibrazione + + + Lancia all'Avvio + + + Salva + + + Salva + + + Opzioni + + + Mostra Notifiche + + + Avvia Minimizzato + + + Avvia + + + Stato + + + Ferma + + + Scorri + + + Striscia + + + Tocco + + + Grilletto + + + Solo Warnings \ No newline at end of file diff --git a/DS4Windows/DS4Forms/Options.ja.resx b/DS4Windows/Translations/Strings.ja.resx similarity index 54% rename from DS4Windows/DS4Forms/Options.ja.resx rename to DS4Windows/Translations/Strings.ja.resx index efb4de959b..4967127dc9 100644 --- a/DS4Windows/DS4Forms/Options.ja.resx +++ b/DS4Windows/Translations/Strings.ja.resx @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ускорение + + + Действие + + + Добавить каталог + + + Добавить программы + + + Добавить программы меню Пуск + + + Добавить игры Steam + + + Все + + + Авто-Профили + + + Аккумулятор + + + Выбрать + + + Выбрать другие программы + + + Отмена + + + Проверка обновлений + + + Проверка обновлений DS4Windows при запуске + + + Очистить + + + Сворачивать при закрытии + + + Цвет + + + Контроллер 1 + + + Контроллер 2 + + + Контроллер 3 + + + Контроллер 4 + + + Контроллеры + + + Панель управления + + + Удалить + + + Настройка драйвера контроллера + + + Дублировать + + + Редактировать + + + Изменить действие + + + Экспорт + + + Полностью + + + Гироскоп + + + Скрыть не выбранные + + + Импорт + + + Левый стик + + + Журнал + + + Название + + + Новый + + + Новое действие + + + Новый профиль + + + Нет + + + Путь + + + Профиль + + + Папка профиля + + + Быстрая зарядка + + + Запись + + + Удалить + + + Удалить действие + + + Правый стик + + + Вибрация + + + Запускать при запуске системы + + + Сохранить + + + Сохранить + + + Настройки + + + Показать уведомления + + + Запускать свернутым + + + Старт + + + Статус + + + Стоп + + + Прокрутка + + + Скольжение + + + Касание + + + Триггер + + + Только предупреждения + + + сек + + + Автоостановка в секундах (0=отключена) + + diff --git a/DS4Windows/VJoyFeeder/vJoyFeeder.cs b/DS4Windows/VJoyFeeder/vJoyFeeder.cs new file mode 100644 index 0000000000..1e6a398313 --- /dev/null +++ b/DS4Windows/VJoyFeeder/vJoyFeeder.cs @@ -0,0 +1,716 @@ +// VJoy C# interface file taken from an excellent Shaul's virtual joystick driver project. +// Licensed to public domain as is (http://vjoystick.sourceforge.net/site/index.php/forum/5-Discussion/104-what-is-the-usage-license-for-this-software). +// http://vjoystick.sourceforge.net/site/ +// https://github.com/shauleiz/vJoy/tree/master/apps/common/vJoyInterfaceCS +// +// This module is a feeder for VJoy virtual joystick driver. DS4Windows can optionally re-map and feed buttons and analog axis values from DS4 Controller to VJoy device. +// At first this may seem silly because DS4Windows can already do re-mapping by using a virtual X360 Controller driver, so why feed VJoy virtual driver also? +// Sometimes X360 driver may run out of analog axis options, so for example "SA motion sensor steering wheel emulation" in DS4Windows would reserve a thumbstick X or Y +// axis for SA steering wheel emulation usage. That thumbstick axis would be unavailable for "normal" thumbstick usage after this re-mapping. +// The problem can be solved by configuring DS4Windows to re-map SA steering wheel emulation axis to VJoy axis, so all analog axies in DS4 controller are still available for normal usage. +// + +using System; +using System.Runtime.InteropServices; +using System.Security; // SuppressUnmanagedCodeSecurity support to optimize for performance instead of code security + +namespace DS4Windows.VJoyFeeder +{ + [Flags] + public enum HID_USAGES + { + HID_USAGE_X = 0x30, + HID_USAGE_Y = 0x31, + HID_USAGE_Z = 0x32, + HID_USAGE_RX = 0x33, + HID_USAGE_RY = 0x34, + HID_USAGE_RZ = 0x35, + HID_USAGE_SL0 = 0x36, + HID_USAGE_SL1 = 0x37, + HID_USAGE_WHL = 0x38, + HID_USAGE_POV = 0x39, + } + + public enum VjdStat /* Declares an enumeration data type called BOOLEAN */ + { + VJD_STAT_OWN, // The vJoy Device is owned by this application. + VJD_STAT_FREE, // The vJoy Device is NOT owned by any application (including this one). + VJD_STAT_BUSY, // The vJoy Device is owned by another application. It cannot be acquired by this application. + VJD_STAT_MISS, // The vJoy Device is missing. It either does not exist or the driver is down. + VJD_STAT_UNKN // Unknown + }; + + + // FFB Declarations + + // HID Descriptor definitions - FFB Report IDs + + public enum FFBPType // FFB Packet Type + { + // Write + PT_EFFREP = 0x01, // Usage Set Effect Report + PT_ENVREP = 0x02, // Usage Set Envelope Report + PT_CONDREP = 0x03, // Usage Set Condition Report + PT_PRIDREP = 0x04, // Usage Set Periodic Report + PT_CONSTREP = 0x05, // Usage Set Constant Force Report + PT_RAMPREP = 0x06, // Usage Set Ramp Force Report + PT_CSTMREP = 0x07, // Usage Custom Force Data Report + PT_SMPLREP = 0x08, // Usage Download Force Sample + PT_EFOPREP = 0x0A, // Usage Effect Operation Report + PT_BLKFRREP = 0x0B, // Usage PID Block Free Report + PT_CTRLREP = 0x0C, // Usage PID Device Control + PT_GAINREP = 0x0D, // Usage Device Gain Report + PT_SETCREP = 0x0E, // Usage Set Custom Force Report + + // Feature + PT_NEWEFREP = 0x01 + 0x10, // Usage Create New Effect Report + PT_BLKLDREP = 0x02 + 0x10, // Usage Block Load Report + PT_POOLREP = 0x03 + 0x10, // Usage PID Pool Report + }; + + public enum FFBEType // FFB Effect Type + { + + // Effect Type + ET_NONE = 0, // No Force + ET_CONST = 1, // Constant Force + ET_RAMP = 2, // Ramp + ET_SQR = 3, // Square + ET_SINE = 4, // Sine + ET_TRNGL = 5, // Triangle + ET_STUP = 6, // Sawtooth Up + ET_STDN = 7, // Sawtooth Down + ET_SPRNG = 8, // Spring + ET_DMPR = 9, // Damper + ET_INRT = 10, // Inertia + ET_FRCTN = 11, // Friction + ET_CSTM = 12, // Custom Force Data + }; + + public enum FFB_CTRL + { + CTRL_ENACT = 1, // Enable all device actuators. + CTRL_DISACT = 2, // Disable all the device actuators. + CTRL_STOPALL = 3, // Stop All Effects­ Issues a stop on every running effect. + CTRL_DEVRST = 4, // Device Reset– Clears any device paused condition, enables all actuators and clears all effects from memory. + CTRL_DEVPAUSE = 5, // Device Pause– The all effects on the device are paused at the current time step. + CTRL_DEVCONT = 6, // Device Continue– The all effects that running when the device was paused are restarted from their last time step. + }; + + public enum FFBOP + { + EFF_START = 1, // EFFECT START + EFF_SOLO = 2, // EFFECT SOLO START + EFF_STOP = 3, // EFFECT STOP + }; + + //namespace vJoyInterfaceWrap + //{ + [SuppressUnmanagedCodeSecurity] + public class VJoy + { + + /***************************************************/ + /*********** Various declarations ******************/ + /***************************************************/ + private static RemovalCbFunc UserRemCB; + private static WrapRemovalCbFunc wrf; + private static GCHandle hRemUserData; + + + private static FfbCbFunc UserFfbCB; + private static WrapFfbCbFunc wf; + private static GCHandle hFfbUserData; + + [StructLayout(LayoutKind.Sequential)] + public struct JoystickState + { + public byte bDevice; + public Int32 Throttle; + public Int32 Rudder; + public Int32 Aileron; + public Int32 AxisX; + public Int32 AxisY; + public Int32 AxisZ; + public Int32 AxisXRot; + public Int32 AxisYRot; + public Int32 AxisZRot; + public Int32 Slider; + public Int32 Dial; + public Int32 Wheel; + public Int32 AxisVX; + public Int32 AxisVY; + public Int32 AxisVZ; + public Int32 AxisVBRX; + public Int32 AxisVBRY; + public Int32 AxisVBRZ; + public UInt32 Buttons; + public UInt32 bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 ButtonsEx1; + public UInt32 ButtonsEx2; + public UInt32 ButtonsEx3; + }; + + [StructLayout(LayoutKind.Sequential)] + private struct FFB_DATA + { + private UInt32 size; + private UInt32 cmd; + private IntPtr data; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_CONSTANT + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public Int16 Magnitude; + } + + [System.Obsolete("use FFB_EFF_REPORT")] + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_CONST + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBEType EffectType; + [FieldOffset(8)] + public UInt16 Duration;// Value in milliseconds. 0xFFFF means infinite + [FieldOffset(10)] + public UInt16 TrigerRpt; + [FieldOffset(12)] + public UInt16 SamplePrd; + [FieldOffset(14)] + public Byte Gain; + [FieldOffset(15)] + public Byte TrigerBtn; + [FieldOffset(16)] + public bool Polar; // How to interpret force direction Polar (0-360°) or Cartesian (X,Y) + [FieldOffset(20)] + public Byte Direction; // Polar direction: (0x00-0xFF correspond to 0-360°) + [FieldOffset(20)] + public Byte DirX; // X direction: Positive values are To the right of the center (X); Negative are Two's complement + [FieldOffset(21)] + public Byte DirY; // Y direction: Positive values are below the center (Y); Negative are Two's complement + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_REPORT + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBEType EffectType; + [FieldOffset(8)] + public UInt16 Duration;// Value in milliseconds. 0xFFFF means infinite + [FieldOffset(10)] + public UInt16 TrigerRpt; + [FieldOffset(12)] + public UInt16 SamplePrd; + [FieldOffset(14)] + public Byte Gain; + [FieldOffset(15)] + public Byte TrigerBtn; + [FieldOffset(16)] + public bool Polar; // How to interpret force direction Polar (0-360°) or Cartesian (X,Y) + [FieldOffset(20)] + public Byte Direction; // Polar direction: (0x00-0xFF correspond to 0-360°) + [FieldOffset(20)] + public Byte DirX; // X direction: Positive values are To the right of the center (X); Negative are Two's complement + [FieldOffset(21)] + public Byte DirY; // Y direction: Positive values are below the center (Y); Negative are Two's complement + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_OP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBOP EffectOp; + [FieldOffset(8)] + public Byte LoopCount; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_COND + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public bool isY; + [FieldOffset(8)] + public Int16 CenterPointOffset; // CP Offset: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(12)] + public Int16 PosCoeff; // Positive Coefficient: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(16)] + public Int16 NegCoeff; // Negative Coefficient: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(20)] + public UInt32 PosSatur; // Positive Saturation: Range 0x00­0xFF (0 – 10000) + [FieldOffset(24)] + public UInt32 NegSatur; // Negative Saturation: Range 0x00­0xFF (0 – 10000) + [FieldOffset(28)] + public Int32 DeadBand; // Dead Band: : Range 0x00­0xFF (0 – 10000) + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_ENVLP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public UInt16 AttackLevel; + [FieldOffset(8)] + public UInt16 FadeLevel; + [FieldOffset(12)] + public UInt32 AttackTime; + [FieldOffset(16)] + public UInt32 FadeTime; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_PERIOD + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public UInt32 Magnitude; + [FieldOffset(8)] + public Int16 Offset; + [FieldOffset(12)] + public UInt32 Phase; + [FieldOffset(16)] + public UInt32 Period; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_RAMP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public Int16 Start; // The Normalized magnitude at the start of the effect + [FieldOffset(8)] + public Int16 End; // The Normalized magnitude at the end of the effect + } + + + /***************************************************/ + /***** Import from file vJoyInterface.dll (C) ******/ + /***************************************************/ + + ///// General driver data + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyVersion")] + private static extern short _GetvJoyVersion(); + + [DllImport("vJoyInterface.dll", EntryPoint = "vJoyEnabled")] + private static extern bool _vJoyEnabled(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyProductString")] + private static extern IntPtr _GetvJoyProductString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyManufacturerString")] + private static extern IntPtr _GetvJoyManufacturerString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoySerialNumberString")] + private static extern IntPtr _GetvJoySerialNumberString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "DriverMatch")] + private static extern bool _DriverMatch(ref UInt32 DllVer, ref UInt32 DrvVer); + + ///// vJoy Device properties + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDButtonNumber")] + private static extern int _GetVJDButtonNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDDiscPovNumber")] + private static extern int _GetVJDDiscPovNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDContPovNumber")] + private static extern int _GetVJDContPovNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisExist")] + private static extern UInt32 _GetVJDAxisExist(UInt32 rID, UInt32 Axis); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisMax")] + private static extern bool _GetVJDAxisMax(UInt32 rID, UInt32 Axis, ref long Max); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisMin")] + private static extern bool _GetVJDAxisMin(UInt32 rID, UInt32 Axis, ref long Min); + + [DllImport("vJoyInterface.dll", EntryPoint = "isVJDExists")] + private static extern bool _isVJDExists(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetOwnerPid")] + private static extern int _GetOwnerPid(UInt32 rID); + + ///// Write access to vJoy Device - Basic + [DllImport("vJoyInterface.dll", EntryPoint = "AcquireVJD")] + private static extern bool _AcquireVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "RelinquishVJD")] + private static extern void _RelinquishVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "UpdateVJD")] + private static extern bool _UpdateVJD(UInt32 rID, ref JoystickState pData); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDStatus")] + private static extern int _GetVJDStatus(UInt32 rID); + + + //// Reset functions + [DllImport("vJoyInterface.dll", EntryPoint = "ResetVJD")] + private static extern bool _ResetVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetAll")] + private static extern bool _ResetAll(); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetButtons")] + private static extern bool _ResetButtons(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetPovs")] + private static extern bool _ResetPovs(UInt32 rID); + + ////// Write data + [DllImport("vJoyInterface.dll", EntryPoint = "SetAxis")] + private static extern bool _SetAxis(Int32 Value, UInt32 rID, HID_USAGES Axis); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetBtn")] + private static extern bool _SetBtn(bool Value, UInt32 rID, Byte nBtn); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetDiscPov")] + private static extern bool _SetDiscPov(Int32 Value, UInt32 rID, uint nPov); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetContPov")] + private static extern bool _SetContPov(Int32 Value, UInt32 rID, uint nPov); + + [DllImport("vJoyInterface.dll", EntryPoint = "RegisterRemovalCB", CallingConvention = CallingConvention.Cdecl)] + private extern static void _RegisterRemovalCB(WrapRemovalCbFunc cb, IntPtr data); + + public delegate void RemovalCbFunc(bool complete, bool First, object userData); + public delegate void WrapRemovalCbFunc(bool complete, bool First, IntPtr userData); + + public static void WrapperRemCB(bool complete, bool First, IntPtr userData) + { + + object obj = null; + + if (userData != IntPtr.Zero) + { + // Convert userData from pointer to object + GCHandle handle2 = (GCHandle)userData; + obj = handle2.Target as object; + } + + // Call user-defined CB function + UserRemCB(complete, First, obj); + } + + // Force Feedback (FFB) + [DllImport("vJoyInterface.dll", EntryPoint = "FfbRegisterGenCB", CallingConvention = CallingConvention.Cdecl)] + private extern static void _FfbRegisterGenCB(WrapFfbCbFunc cb, IntPtr data); + + public delegate void FfbCbFunc(IntPtr data, object userData); + public delegate void WrapFfbCbFunc(IntPtr data, IntPtr userData); + + public static void WrapperFfbCB(IntPtr data, IntPtr userData) + { + + object obj = null; + + if (userData != IntPtr.Zero) + { + // Convert userData from pointer to object + GCHandle handle2 = (GCHandle)userData; + obj = handle2.Target as object; + } + + // Call user-defined CB function + UserFfbCB(data, obj); + } + + [DllImport("vJoyInterface.dll", EntryPoint = "FfbStart")] + private static extern bool _FfbStart(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "FfbStop")] + private static extern bool _FfbStop(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "IsDeviceFfb")] + private static extern bool _IsDeviceFfb(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "IsDeviceFfbEffect")] + private static extern bool _IsDeviceFfbEffect(UInt32 rID, UInt32 Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DeviceID")] + private static extern UInt32 _Ffb_h_DeviceID(IntPtr Packet, ref int DeviceID); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Type")] + private static extern UInt32 _Ffb_h_Type(IntPtr Packet, ref FFBPType Type); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Packet")] + private static extern UInt32 _Ffb_h_Packet(IntPtr Packet, ref UInt32 Type, ref Int32 DataSize, ref IntPtr Data); + + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EBI")] + private static extern UInt32 _Ffb_h_EBI(IntPtr Packet, ref Int32 Index); + +#pragma warning disable 618 + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Const")] + private static extern UInt32 _Ffb_h_Eff_Const(IntPtr Packet, ref FFB_EFF_CONST Effect); +#pragma warning restore 618 + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Report")] + private static extern UInt32 _Ffb_h_Eff_Report(IntPtr Packet, ref FFB_EFF_REPORT Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DevCtrl")] + private static extern UInt32 _Ffb_h_DevCtrl(IntPtr Packet, ref FFB_CTRL Control); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EffOp")] + private static extern UInt32 _Ffb_h_EffOp(IntPtr Packet, ref FFB_EFF_OP Operation); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DevGain")] + private static extern UInt32 _Ffb_h_DevGain(IntPtr Packet, ref Byte Gain); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Cond")] + private static extern UInt32 _Ffb_h_Eff_Cond(IntPtr Packet, ref FFB_EFF_COND Condition); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Envlp")] + private static extern UInt32 _Ffb_h_Eff_Envlp(IntPtr Packet, ref FFB_EFF_ENVLP Envelope); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Period")] + private static extern UInt32 _Ffb_h_Eff_Period(IntPtr Packet, ref FFB_EFF_PERIOD Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EffNew")] + private static extern UInt32 _Ffb_h_EffNew(IntPtr Packet, ref FFBEType Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Ramp")] + private static extern UInt32 _Ffb_h_Eff_Ramp(IntPtr Packet, ref FFB_EFF_RAMP RampEffect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Constant")] + private static extern UInt32 _Ffb_h_Eff_Constant(IntPtr Packet, ref FFB_EFF_CONSTANT ConstantEffect); + + /***************************************************/ + /********** Export functions (C#) ******************/ + /***************************************************/ + + ///// General driver data + public short GetvJoyVersion() { return _GetvJoyVersion(); } + public bool vJoyEnabled() { return _vJoyEnabled(); } + public string GetvJoyProductString() { return Marshal.PtrToStringAuto(_GetvJoyProductString()); } + public string GetvJoyManufacturerString() { return Marshal.PtrToStringAuto(_GetvJoyManufacturerString()); } + public string GetvJoySerialNumberString() { return Marshal.PtrToStringAuto(_GetvJoySerialNumberString()); } + public bool DriverMatch(ref UInt32 DllVer, ref UInt32 DrvVer) { return _DriverMatch(ref DllVer, ref DrvVer); } + + ///// vJoy Device properties + public int GetVJDButtonNumber(uint rID) { return _GetVJDButtonNumber(rID); } + public int GetVJDDiscPovNumber(uint rID) { return _GetVJDDiscPovNumber(rID); } + public int GetVJDContPovNumber(uint rID) { return _GetVJDContPovNumber(rID); } + public bool GetVJDAxisExist(UInt32 rID, HID_USAGES Axis) + { + UInt32 res = _GetVJDAxisExist(rID, (uint)Axis); + if (res == 1) + return true; + else + return false; + } + public bool GetVJDAxisMax(UInt32 rID, HID_USAGES Axis, ref long Max) { return _GetVJDAxisMax(rID, (uint)Axis, ref Max); } + public bool GetVJDAxisMin(UInt32 rID, HID_USAGES Axis, ref long Min) { return _GetVJDAxisMin(rID, (uint)Axis, ref Min); } + public bool isVJDExists(UInt32 rID) { return _isVJDExists(rID); } + public int GetOwnerPid(UInt32 rID) { return _GetOwnerPid(rID); } + + ///// Write access to vJoy Device - Basic + public bool AcquireVJD(UInt32 rID) { return _AcquireVJD(rID); } + public void RelinquishVJD(uint rID) { _RelinquishVJD(rID); } + public bool UpdateVJD(UInt32 rID, ref JoystickState pData) { return _UpdateVJD(rID, ref pData); } + public VjdStat GetVJDStatus(UInt32 rID) { return (VjdStat)_GetVJDStatus(rID); } + + //// Reset functions + public bool ResetVJD(UInt32 rID) { return _ResetVJD(rID); } + public bool ResetAll() { return _ResetAll(); } + public bool ResetButtons(UInt32 rID) { return _ResetButtons(rID); } + public bool ResetPovs(UInt32 rID) { return _ResetPovs(rID); } + + ////// Write data + public bool SetAxis(Int32 Value, UInt32 rID, HID_USAGES Axis) { return _SetAxis(Value, rID, Axis); } + public bool SetBtn(bool Value, UInt32 rID, uint nBtn) { return _SetBtn(Value, rID, (Byte)nBtn); } + public bool SetDiscPov(Int32 Value, UInt32 rID, uint nPov) { return _SetDiscPov(Value, rID, nPov); } + public bool SetContPov(Int32 Value, UInt32 rID, uint nPov) { return _SetContPov(Value, rID, nPov); } + + // Register CB function that takes a C# object as userdata + public void RegisterRemovalCB(RemovalCbFunc cb, object data) + { + // Free existing GCHandle (if exists) + if (hRemUserData.IsAllocated && hRemUserData.Target != null) + hRemUserData.Free(); + + // Convert object to pointer + hRemUserData = GCHandle.Alloc(data); + + // Apply the user-defined CB function + UserRemCB = new RemovalCbFunc(cb); + wrf = new WrapRemovalCbFunc(WrapperRemCB); + + _RegisterRemovalCB(wrf, (IntPtr)hRemUserData); + } + + // Register CB function that takes a pointer as userdata + public void RegisterRemovalCB(WrapRemovalCbFunc cb, IntPtr data) + { + wrf = new WrapRemovalCbFunc(cb); + _RegisterRemovalCB(wrf, data); + } + + + ///////////////////////////////////////////////////////////////////////////////////////////// + //// Force Feedback (FFB) + + // Register CB function that takes a C# object as userdata + public void FfbRegisterGenCB(FfbCbFunc cb, object data) + { + // Free existing GCHandle (if exists) + if (hFfbUserData.IsAllocated && hFfbUserData.Target != null) + hFfbUserData.Free(); + + // Convert object to pointer + hFfbUserData = GCHandle.Alloc(data); + + // Apply the user-defined CB function + UserFfbCB = new FfbCbFunc(cb); + wf = new WrapFfbCbFunc(WrapperFfbCB); + + _FfbRegisterGenCB(wf, (IntPtr)hFfbUserData); + } + + // Register CB function that takes a pointer as userdata + public void FfbRegisterGenCB(WrapFfbCbFunc cb, IntPtr data) + { + wf = new WrapFfbCbFunc(cb); + _FfbRegisterGenCB(wf, data); + } + + [Obsolete("you can remove the function from your code")] + public bool FfbStart(UInt32 rID) { return _FfbStart(rID); } + [Obsolete("you can remove the function from your code")] + public bool FfbStop(UInt32 rID) { return _FfbStop(rID); } + public bool IsDeviceFfb(UInt32 rID) { return _IsDeviceFfb(rID); } + public bool IsDeviceFfbEffect(UInt32 rID, UInt32 Effect) { return _IsDeviceFfbEffect(rID, Effect); } + public UInt32 Ffb_h_DeviceID(IntPtr Packet, ref int DeviceID) { return _Ffb_h_DeviceID(Packet, ref DeviceID); } + public UInt32 Ffb_h_Type(IntPtr Packet, ref FFBPType Type) { return _Ffb_h_Type(Packet, ref Type); } + public UInt32 Ffb_h_Packet(IntPtr Packet, ref UInt32 Type, ref Int32 DataSize, ref Byte[] Data) + { + IntPtr buf = IntPtr.Zero; + UInt32 res = _Ffb_h_Packet(Packet, ref Type, ref DataSize, ref buf); + if (res != 0) + return res; + + DataSize -= 8; + Data = new byte[DataSize]; + Marshal.Copy(buf, Data, 0, DataSize); + return res; + } + public UInt32 Ffb_h_EBI(IntPtr Packet, ref Int32 Index) { return _Ffb_h_EBI(Packet, ref Index); } + [Obsolete("use Ffb_h_Eff_Report instead")] + public UInt32 Ffb_h_Eff_Const(IntPtr Packet, ref FFB_EFF_CONST Effect) { return _Ffb_h_Eff_Const(Packet, ref Effect); } + public UInt32 Ffb_h_Eff_Report(IntPtr Packet, ref FFB_EFF_REPORT Effect) { return _Ffb_h_Eff_Report(Packet, ref Effect); } + public UInt32 Ffb_h_DevCtrl(IntPtr Packet, ref FFB_CTRL Control) { return _Ffb_h_DevCtrl(Packet, ref Control); } + public UInt32 Ffb_h_EffOp(IntPtr Packet, ref FFB_EFF_OP Operation) { return _Ffb_h_EffOp(Packet, ref Operation); } + public UInt32 Ffb_h_DevGain(IntPtr Packet, ref Byte Gain) { return _Ffb_h_DevGain(Packet, ref Gain); } + public UInt32 Ffb_h_Eff_Cond(IntPtr Packet, ref FFB_EFF_COND Condition) { return _Ffb_h_Eff_Cond(Packet, ref Condition); } + public UInt32 Ffb_h_Eff_Envlp(IntPtr Packet, ref FFB_EFF_ENVLP Envelope) { return _Ffb_h_Eff_Envlp(Packet, ref Envelope); } + public UInt32 Ffb_h_Eff_Period(IntPtr Packet, ref FFB_EFF_PERIOD Effect) { return _Ffb_h_Eff_Period(Packet, ref Effect); } + public UInt32 Ffb_h_EffNew(IntPtr Packet, ref FFBEType Effect) { return _Ffb_h_EffNew(Packet, ref Effect); } + public UInt32 Ffb_h_Eff_Ramp(IntPtr Packet, ref FFB_EFF_RAMP RampEffect) { return _Ffb_h_Eff_Ramp(Packet, ref RampEffect); } + public UInt32 Ffb_h_Eff_Constant(IntPtr Packet, ref FFB_EFF_CONSTANT ConstantEffect) { return _Ffb_h_Eff_Constant(Packet, ref ConstantEffect); } + } + //} + + public class vJoyFeeder + { + private static readonly object vJoyLocker = new object(); + + static bool vJoyInitialized = false; + static bool vJoyAvailable = false; + static VJoy vJoyObj = null; + + vJoyFeeder() + { + // Do nothing + } + + ~vJoyFeeder() + { + // Do nothing + } + + public static void InitializeVJoyDevice(uint vJoyID, HID_USAGES axis) + { + lock (vJoyLocker) + { + if (vJoyInitialized) return; + + vJoyInitialized = true; + AppLogger.LogToGui("Initializing VJoy virtual joystick driver via vJoyInterface.dll interface", false); + + try + { + if (vJoyObj == null) vJoyObj = new VJoy(); + + if (vJoyObj.vJoyEnabled() && vJoyObj.GetVJDAxisExist(vJoyID, axis)) + { + AppLogger.LogToGui("Connection to VJoy virtual joystick established", false); + AppLogger.LogToGui($"VJoy driver. Vendor={vJoyObj.GetvJoyManufacturerString()} Product={vJoyObj.GetvJoyProductString()} Version={vJoyObj.GetvJoySerialNumberString()} Device#={vJoyID} Axis={axis}", false); + + // Test if DLL matches the driver + UInt32 DllVer = 0, DrvVer = 0; + if (!vJoyObj.DriverMatch(ref DllVer, ref DrvVer)) + AppLogger.LogToGui("WARNING. VJoy version of Driver {DrvVer}) does not match interface DLL Version {DllVer}. This may lead to unexpected problems or crashes. Update VJoy driver and vJoyInterface.dll", false); + + VjdStat status = vJoyObj.GetVJDStatus(vJoyID); + if ((status == VjdStat.VJD_STAT_OWN) || ((status == VjdStat.VJD_STAT_FREE) && (!vJoyObj.AcquireVJD(vJoyID)))) + { + vJoyAvailable = false; + AppLogger.LogToGui("ERROR. Failed to acquire vJoy device# {vJoyID}. Use another VJoy device or make sure there are no other VJoy feeder apps using the same device", false); + } + else + { + //vJoyObj.GetVJDAxisMax(vJoyID, axis, ref vJoyAxisMaxValue); + //AppLogger.LogToGui($"VJoy axis {axis} max value={vJoyAxisMaxValue}", false); + vJoyObj.ResetVJD(vJoyID); + vJoyAvailable = true; + } + } + else + { + vJoyAvailable = false; + AppLogger.LogToGui($"ERROR. VJoy device# {vJoyID} or {axis} axis not available. Check vJoy driver installation and configuration", false); + } + } + catch + { + vJoyAvailable = false; + AppLogger.LogToGui("ERROR. vJoy initialization failed. Make sure that DS4Windows application can find vJoyInterface.dll library file", false); + } + } + } + + // Feed axis value to VJoy virtual joystic driver (DS4Windows sixaxis (SA) motion sensor steering wheel emulation feature can optionally feed VJoy analog axis instead of ScpVBus x360 axis + public static void FeedAxisValue(int value, uint vJoyID, HID_USAGES axis) + { + if (vJoyAvailable) + { + vJoyObj.SetAxis(value, vJoyID, axis); + } + else if (!vJoyInitialized) + { + // If this was the first call to this FeedAxisValue function and VJoy driver connection is not yet initialized + // then try to do it now. Subsequent calls will see the the vJoy as available (if connection succeeded) and + // there is no need to re-initialize the connection everytime the feeder is used. + InitializeVJoyDevice(vJoyID, axis); + } + } + } +} diff --git a/DS4Windows/app.config b/DS4Windows/app.config index d1428ad712..9326f834e9 100644 --- a/DS4Windows/app.config +++ b/DS4Windows/app.config @@ -1,6 +1,13 @@ - + - + + - + + + + + + + \ No newline at end of file diff --git a/DS4Windows/app.manifest b/DS4Windows/app.manifest index c87b5ff1d7..bb0180e2a1 100644 --- a/DS4Windows/app.manifest +++ b/DS4Windows/app.manifest @@ -23,24 +23,24 @@ - + - + - + - + - + - + @@ -49,11 +49,13 @@ DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. --> +