diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe0770..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.gitignore b/.gitignore index 6a5b56e..5a9c6ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ - -Resources/Preferences -Resources/Custom Cursor/* +Resources/Cursors/Edited +prefs diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..40bd8f5 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ms-vscode.powershell" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ff8f817 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Launch CCS", + "type": "PowerShell", + "request": "launch", + "script": "${workspaceFolder}/CCS.ps1", + "args": [] + }, + { + "name": "Launch Listener", + "type": "PowerShell", + "request": "launch", + "script": "${workspaceFolder}/Listener.ps1", + "args": [] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..40635a6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "[powershell]": { + "editor.defaultFormatter": "ms-vscode.powershell" + }, + "powershell.codeFormatting.autoCorrectAliases": true, + "powershell.codeFormatting.trimWhitespaceAroundPipe": true, + "powershell.codeFormatting.useCorrectCasing": true, + "powershell.codeFormatting.whitespaceBetweenParameters": true, + "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": true, + "powershell.codeFormatting.useConstantStrings": true +} diff --git a/CCS.ps1 b/CCS.ps1 index 2a93cb3..6ae6e16 100644 --- a/CCS.ps1 +++ b/CCS.ps1 @@ -1,136 +1,132 @@ -#Requires -RunAsAdministrator -#Requires -Version 5.1 - -#region Preparation -$ErrorActionPreference = 'Stop' -[Console]::Title = 'Cursor Colors Synchronizer' -Remove-Module -Name Functions -ErrorAction SilentlyContinue -Clear-Variable -Name Localization, windowsTheme, cursorSize, useClassicWheel, useAlternatePrecision, originalCursorFolder, customCursorFolder, byteDiffFolder, useListener, choice -ErrorAction SilentlyContinue -Import-LocalizedData -BindingVariable Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Strings -Import-Module -Name $PSScriptRoot\Functions.ps1 -#endregion Preparation - -#region Dialogs -do { - Clear-Host - Write-Host - Write-Host -Object $Localization.ChooseSizeDialogTitle - Write-Host - Write-Host -Object ('1) ' + $Localization.Small) - Write-Host -Object ('2) ' + $Localization.Regular) - Write-Host -Object ('3) ' + $Localization.Big) - Write-Host - $choice = Read-Host -Prompt $Localization.ChooseDialogPromt -} until ( Validate-Input -Object $choice -Values (1..3) ) -switch ($choice) { - 1 {$cursorSize = 'small'} - 2 {$cursorSize = 'regular'} - 3 {$cursorSize = 'big'} -} - -do { - Clear-Host - Write-Host - Write-Host -Object $Localization.ChooseWheelDialogTitle - Write-Host - Write-Host -Object ('1) ' + $Localization.No) - Write-Host -Object ('2) ' + $Localization.Yes) - Write-Host - $choice = Read-Host -Prompt $Localization.ChooseDialogPromt -} until ( Validate-Input -Object $choice -Values (1..2) ) -switch ($choice) { - 1 {$useClassicWheel = $false} - 2 {$useClassicWheel = $true} -} - -do { - Clear-Host - Write-Host - Write-Host -Object $Localization.ChoosePrecisionDialogTitle - Write-Host - Write-Host -Object ('1) ' + $Localization.Yes) - Write-Host -Object ('2) ' + $Localization.No) - Write-Host - $choice = Read-Host -Prompt $Localization.ChooseDialogPromt -} until ( Validate-Input -Object $choice -Values (1..2) ) -switch ($choice) { - 1 {$useAlternatePrecision = $true} - 2 {$useAlternatePrecision = $false} -} - -do { - Clear-Host - Write-Host - Write-Host -Object $Localization.ListenerDialogTitle - Write-Host - Write-Host -Object ('1) ' + $Localization.Yes) - Write-Host -Object ('2) ' + $Localization.No) - Write-Host - $choice = Read-Host -Prompt $Localization.ChooseDialogPromt -} until ( Validate-Input -Object $choice -Values (1..2) ) -switch ($choice) { - 1 {$useListener = $true} - 2 {$useListener = $false} -} -#endregion Dialogs - - -#region Variables -$windowsTheme = Get-WindowsTheme -$originalCursorFolder = "$PSScriptRoot\Resources\Original Cursors\$windowsTheme\$cursorSize" -$byteDiffFolder = "$PSScriptRoot\Resources\Byte Diff\$cursorSize" -$customCursorFolder = "$PSScriptRoot\Resources\Custom Cursor" -#endregion Variables - -#region Cursor -Copy-Item -Path $originalCursorFolder\default\* -Destination $customCursorFolder -Recurse -Force -if ($useClassicWheel -eq $false) { - if ( ($windowsTheme -eq 'light') -and ($cursorSize -eq 'big') ) { - Create-PatchedCursorFiles -CursorPath $originalCursorFolder\default -DiffPath $byteDiffFolder -UseAlternateDiff $true - } - else { - Create-PatchedCursorFiles -CursorPath $originalCursorFolder\default -DiffPath $byteDiffFolder - } -} -else { - Copy-Item -Path $originalCursorFolder\alternatives\busy.ani -Destination $customCursorFolder -Force - Copy-Item -Path $originalCursorFolder\alternatives\working.ani -Destination $customCursorFolder -Force -} -if ($useAlternatePrecision) { - Copy-Item -Path $originalCursorFolder\alternatives\precision.cur -Destination $customCursorFolder -Force -} -Install-CursorFromFolder -Path $customCursorFolder -Apply-Changes -#endregion Cursor - -#region Parameters -Set-Content -Path $PSScriptRoot\Resources\Preferences -Value $cursorSize -Add-Content -Path $PSScriptRoot\Resources\Preferences -Value $useClassicWheel -Add-Content -Path $PSScriptRoot\Resources\Preferences -Value $useAlternatePrecision -#endregion Parameters - -#region Listener -if ($useListener) { - $name = 'CCS Listener' - $action = New-ScheduledTaskAction -Execute powershell.exe -Argument ("-ExecutionPolicy Bypass -WindowStyle Hidden -File $PSScriptRoot\Listener.ps1") - $user = whoami - $trigger = New-ScheduledTaskTrigger -AtLogOn -User $user - $description = $Localization.ListenerTaskDescription - $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -StartWhenAvailable -DontStopIfGoingOnBatteries -ExecutionTimeLimit '00:00:00' - Stop-ScheduledTask -TaskName $name -ErrorAction SilentlyContinue - Register-ScheduledTask -TaskName $name -Description $description -Action $action -Trigger $trigger -Settings $settings -RunLevel Highest -Force | Out-Null - Start-Sleep -Seconds 1 - Start-ScheduledTask -TaskName $name -} -#endregion Listener - -#region Final Messages -Clear-Host -Write-Host -Write-Host -Object $Localization.SuccessMessage -ForegroundColor Green -Write-Host -Write-Host -Object $Localization.GitHubReminderMessage -Write-Host -Pause -exit -#endregion Final Messages +#Requires -RunAsAdministrator +#Requires -Version 5.1 + +#region Preparation +$ErrorActionPreference = 'Stop' + +$previousWindowTitle = $Host.UI.RawUI.WindowTitle +$Host.UI.RawUI.WindowTitle = 'Cursor Colors Synchronizer' + +$Parameters = @{ + BindingVariable = 'Localization' + BaseDirectory = "$PSScriptRoot\Localizations" + FileName = 'Strings' +} +Import-LocalizedData @Parameters + +Import-Module -Name "$PSScriptRoot\Functions.psm1" -Force +#endregion Preparation + +#region Dialogs +Clear-Host + +$Host.UI.RawUI.Flushinputbuffer() +$choice = $Host.UI.PromptForChoice( + '', + $Localization.ChooseDialogPromt, + ( + "&1 $($Localization.Small)", + "&2 $($Localization.Regular)", + "&3 $($Localization.Big)" + ), + 0 +) +switch ($choice) { + 0 { $cursorSize = 'small' } + 1 { $cursorSize = 'regular' } + 2 { $cursorSize = 'big' } +} + + +$Host.UI.RawUI.Flushinputbuffer() +$choice = $Host.UI.PromptForChoice( + '', + $Localization.ChoosePrecisionDialogTitle, + ( + "&1 $($Localization.Yes)", + "&2 $($Localization.No)" + ), + 1 +) +switch ($choice) { + 0 { $useAlternatePrecision = $true } + 1 { $useAlternatePrecision = $false } +} + +$Host.UI.RawUI.Flushinputbuffer() +$choice = $Host.UI.PromptForChoice( + '', + $Localization.ListenerDialogTitle, + ( + "&1 $($Localization.Yes)", + "&2 $($Localization.No)" + ), + 0 +) +switch ($choice) { + 0 { $installListener = $true } + 1 { $installListener = $false } +} +#endregion Dialogs + + +#region Variables +$systemTheme = Get-SystemTheme +$prefsPath = "$PSScriptRoot\prefs" +$resourcesFolderPath = "$PSScriptRoot\Resources" +$diffFolder = "$resourcesFolderPath\Diffs\$cursorSize" +$cursorsFolderPath = "$resourcesFolderPath\Cursors" +$originalCursorFolderPath = "$cursorsFolderPath\Original\$systemTheme\$cursorSize" +$editedCursorFolderPath = "$cursorsFolderPath\Edited" +#endregion Variables + +#region Cursor +Copy-Item -Path "$originalCursorFolderPath\default\*" -Destination $editedCursorFolderPath -Recurse -Force +if (($systemTheme -eq 'light') -and ($cursorSize -eq 'big')) { + Edit-Cursors -Path $editedCursorFolderPath -DiffFolderPath $diffFolder -UseAlternateDiff +} +else { + Edit-Cursors -Path $editedCursorFolderPath -DiffFolderPath $diffFolder +} + +if ($useAlternatePrecision) { + Copy-Item -Path "$originalCursorFolderPath\alternatives\precision.cur" -Destination $editedCursorFolderPath -Force +} +Install-Cursors -Path $editedCursorFolderPath +Update-Cursor +#endregion Cursor + +#region Parameters +Set-Content -Path $prefsPath -Value $cursorSize +Add-Content -Path $prefsPath -Value $useAlternatePrecision +#endregion Parameters + +#region Listener +if ($installListener) { + $Parameters = @{ + TaskName = 'CCS Listener' + Description = $Localization.ListenerTaskDescription + Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-ExecutionPolicy Bypass -NoExit -WindowStyle Hidden -File `"$PSScriptRoot\Listener.ps1`"" + Trigger = New-ScheduledTaskTrigger -AtLogOn -User (whoami) + Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -StartWhenAvailable -DontStopIfGoingOnBatteries -ExecutionTimeLimit '00:00:00' + RunLevel = 'Highest' + Force = $true + } + Stop-ScheduledTask -TaskName $Parameters.TaskName -ErrorAction 'SilentlyContinue' + Register-ScheduledTask @Parameters | Out-Null + Start-Sleep -Seconds 1 + Start-ScheduledTask -TaskName $Parameters.TaskName +} +#endregion Listener + +#region Final Messages +Write-Host +Write-Host -Object $Localization.SuccessMessage -ForegroundColor 'Green' +Write-Host +Write-Host -Object $Localization.GitHubReminderMessage +Write-Host +Remove-Module -Name 'Functions' +$Host.UI.RawUI.WindowTitle = $previousWindowTitle +Pause +exit +#endregion Final Messages diff --git a/Functions.ps1 b/Functions.ps1 deleted file mode 100644 index 26ab4e4..0000000 --- a/Functions.ps1 +++ /dev/null @@ -1,178 +0,0 @@ -#Requires -RunAsAdministrator -#Requires -Version 5.1 - -function Get-WindowsTheme { - switch (Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name SystemUsesLightTheme) { - 0 {return 'dark' } - 1 {return 'light'} - } -} - -function Get-WindowsAccentColor { - [CmdletBinding()] - # Get current accent color from the registry by channels ignoring alpha - $b = ('{0:X}' -f (Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\DWM -Name AccentColor))[2,3] - $g = ('{0:X}' -f (Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\DWM -Name AccentColor))[4,5] - $r = ('{0:X}' -f (Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\DWM -Name AccentColor))[6,7] - # Combine lines into one string and convert to decimal - $b = [int]('0x' + (-join ($b[0], $b[1]))) - $g = [int]('0x' + (-join ($g[0], $g[1]))) - $r = [int]('0x' + (-join ($r[0], $r[1]))) - return @{ - R = $r - G = $g - B = $b - } -} - -# For dev usage -# Compare two cursors which differ only in colors using Unix cmp tool, then use this funtion to get only addresses of the differing bytes -function Get-DiffAddresses { - [CmdletBinding()] - param ( - [Parameter(Mandatory)] - [array]$Diff - ) - $i = 0 - $diff | foreach { - $diff[$i] = ($_.Trim() -split ' ')[0] - 1 - $i++ - } - return $diff -} - -function Validate-Input { - param ( - [Parameter(Mandatory)] - $Object, - - [Parameter(Mandatory)] - [array]$Values - ) - if ($object -in $values) { - return $true - } - else { - return $false - } -} - -function Patch-Cursor { - [CmdletBinding()] - param ( - [Parameter(Mandatory)] - [array]$Diff, - - [Parameter(Mandatory)] - [byte[]]$Cursor - ) - $color = Get-WindowsAccentColor - $counter = 0 - foreach ($byteAddress in $diff) { - $counter++ - switch ($counter) { - 1 {$cursor[$byteAddress] = '0x{0:X}' -f $color.B} - 2 {$cursor[$byteAddress] = '0x{0:X}' -f $color.G} - 3 {$cursor[$byteAddress] = '0x{0:X}' -f $color.R; $counter = 0} - } - } - return $cursor -} - -function Create-PatchedCursorFiles { - param ( - [Parameter(Mandatory)] - [string]$CursorPath, - - [Parameter(Mandatory)] - [string]$DiffPath, - - [boolean]$UseAlternateDiff - ) - $cursor = [System.IO.File]::ReadAllBytes("$CursorPath\busy.ani") - if ($useAlternateDiff) { - $cursor = Patch-Cursor -Diff (Get-Content $DiffPath\busy_light) -Cursor $cursor - } - else { - $cursor = Patch-Cursor -Diff (Get-Content $DiffPath\busy) -Cursor $cursor - } - [System.IO.File]::WriteAllBytes("$PSScriptRoot\Resources\Custom Cursor\busy.ani", $cursor) - $cursor = [System.IO.File]::ReadAllBytes("$CursorPath\working.ani") - $cursor = Patch-Cursor -Diff (Get-Content $DiffPath\working) -Cursor $cursor - [System.IO.File]::WriteAllBytes("$PSScriptRoot\Resources\Custom Cursor\working.ani", $cursor) -} - -function Install-Cursor { - [CmdletBinding()] - param ( - [Parameter(Mandatory)] - [string]$Name, - - [Parameter(Mandatory)] - [string]$Path - ) - New-ItemProperty -Path 'HKCU:\Control Panel\Cursors' -Name $Name -PropertyType String -Value $Path -Force | Out-Null -} - -function Install-CursorFromFolder { - [CmdletBinding()] - param ( - [Parameter(Mandatory)] - [string]$Path - ) - foreach ($cursor in Get-ChildItem -Path $Path) { - switch ($cursor.Name) { - {$_ -eq 'alternate.cur' } {Install-Cursor -Name UpArrow -Path $cursor.FullName} - {$_ -eq 'beam.cur' } {Install-Cursor -Name IBeam -Path $cursor.FullName} - {$_ -eq 'busy.ani' } {Install-Cursor -Name Wait -Path $cursor.FullName} - {$_ -eq 'dgn1.cur' } {Install-Cursor -Name SizeNWSE -Path $cursor.FullName} - {$_ -eq 'dgn2.cur' } {Install-Cursor -Name SizeNESW -Path $cursor.FullName} - {$_ -eq 'handwriting.cur'} {Install-Cursor -Name NWPen -Path $cursor.FullName} - {$_ -eq 'help.cur' } {Install-Cursor -Name Help -Path $cursor.FullName} - {$_ -eq 'horz.cur' } {Install-Cursor -Name SizeWE -Path $cursor.FullName} - {$_ -eq 'link.cur' } {Install-Cursor -Name Hand -Path $cursor.FullName} - {$_ -eq 'move.cur' } {Install-Cursor -Name SizeAll -Path $cursor.FullName} - {$_ -eq 'person.cur' } {Install-Cursor -Name Person -Path $cursor.FullName} - {$_ -eq 'pin.cur' } {Install-Cursor -Name Pin -Path $cursor.FullName} - {$_ -eq 'pointer.cur' } {Install-Cursor -Name Arrow -Path $cursor.FullName} - {$_ -eq 'precision.cur' } {Install-Cursor -Name Crosshair -Path $cursor.FullName} - {$_ -eq 'unavailable.cur'} {Install-Cursor -Name No -Path $cursor.FullName} - {$_ -eq 'vert.cur' } {Install-Cursor -Name SizeNS -Path $cursor.FullName} - {$_ -eq 'working.ani' } {Install-Cursor -Name AppStarting -Path $cursor.FullName} - } - } -} - -function Restore-DefaultCursor { - Install-Cursor -Name AppStarting -Path %SystemRoot%\cursors\aero_working.ani - Install-Cursor -Name Arrow -Path %SystemRoot%\cursors\aero_arrow.cur - Install-Cursor -Name Crosshair -Path %SystemRoot%\cursors\aero_unavail.cur - Install-Cursor -Name Hand -Path %SystemRoot%\cursors\aero_link.cur - Install-Cursor -Name Help -Path %SystemRoot%\cursors\aero_helpsel.cur - Install-Cursor -Name No -Path %SystemRoot%\cursors\aero_unavail.cur - Install-Cursor -Name NWPen -Path %SystemRoot%\cursors\aero_pen.cur - Install-Cursor -Name Person -Path %SystemRoot%\cursors\aero_person.cur - Install-Cursor -Name Pin -Path %SystemRoot%\cursors\aero_pin.cur - Install-Cursor -Name SizeAll -Path %SystemRoot%\cursors\aero_move.cur - Install-Cursor -Name SizeNESW -Path %SystemRoot%\cursors\aero_nesw.cur - Install-Cursor -Name SizeNS -Path %SystemRoot%\cursors\aero_ns.cur - Install-Cursor -Name SizeNWSE -Path %SystemRoot%\cursors\aero_nwse.cur - Install-Cursor -Name SizeWE -Path %SystemRoot%\cursors\aero_ew.cur - Install-Cursor -Name UpArrow -Path %SystemRoot%\cursors\aero_up.cur - Install-Cursor -Name Wait -Path %SystemRoot%\cursors\aero_busy.ani - New-ItemProperty -Path 'HKCU:\Control Panel\Cursors' -Name IBeam -PropertyType String -Value $null -Force | Out-Null -} - -function Apply-Changes { - # Define a C# class for calling WinAPI - Add-Type -TypeDefinition @' - public class SysParamsInfo { - [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] - public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni); - public static void UpdateCursor() { - SystemParametersInfo(0x0057, 0, 0, 0x01 | 0x02); - } - } -'@ -[SysParamsInfo]::UpdateCursor() -} \ No newline at end of file diff --git a/Functions.psm1 b/Functions.psm1 new file mode 100644 index 0000000..9d780ed --- /dev/null +++ b/Functions.psm1 @@ -0,0 +1,461 @@ +#Requires -RunAsAdministrator +#Requires -Version 5.1 + +$ErrorActionPreference = 'Stop' + +# For dev usage +# Compare two cursors which differ only in colors using Unix cmp tool, save the output to a file, then use this function to get only the addresses of the differing bytes +function Get-DiffAddresses { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string]$Path, + + [Parameter(Mandatory)] + [string]$Destination + ) + begin { + $Parameters = @{ + Path = $Destination + Value = $null + Force = $true + } + Set-Content @Parameters + } + process { + Get-Content -Path $Path | ForEach-Object -Process { + Add-Content -Path $Destination -Value (($PSItem.Trim() -split ' ')[0] - 1) + } + } +} + +function Get-SystemTheme { + [CmdletBinding()] + [OutputType([string])] + param () + begin { + $Parameters = @{ + Path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize' + Name = 'SystemUsesLightTheme' + } + } + process { + switch (Get-ItemPropertyValue @Parameters) { + 0 { 'dark' } + 1 { 'light' } + } + } +} + +function Get-AccentColor { + [CmdletBinding()] + [OutputType([hashtable])] + param () + begin { + $Parameters = @{ + Path = 'HKCU:\Software\Microsoft\Windows\DWM' + Name = 'AccentColor' + } + } + process { + $accentColor = Get-ItemPropertyValue @Parameters + $accentColorInHex = '{0:X}' -f ($accentColor) + $b = $accentColorInHex.Substring(2, 2) + $g = $accentColorInHex.Substring(4, 2) + $r = $accentColorInHex.Substring(6, 2) + $b = [int]("0x$b") + $g = [int]("0x$g") + $r = [int]("0x$r") + } + end { + @{ + R = $r + G = $g + B = $b + } + } +} + +function New-EditedCursor { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [array]$Diff, + + [Parameter(Mandatory)] + [byte[]]$Cursor + ) + begin { + $targetColor = Get-AccentColor + $targetColor.B = '0x{0:X}' -f $targetColor.B + $targetColor.G = '0x{0:X}' -f $targetColor.G + $targetColor.R = '0x{0:X}' -f $targetColor.R + $i = 0 + } + process { + foreach ($address in $Diff) { + $i++ + switch ($i) { + 1 { + $Cursor[$address] = $targetColor.B + break + } + 2 { + $Cursor[$address] = $targetColor.G + break + } + 3 { + $Cursor[$address] = $targetColor.R + $i = 0 + } + } + } + } + end { + $Cursor + } +} + +function Edit-Cursors { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string]$Path, + + [Parameter(Mandatory)] + [string]$DiffFolderPath, + + [switch]$UseAlternateDiff + ) + begin { + $busyCursorFolderPath = "$Path\busy.ani" + $workingCursorFolderPath = "$Path\working.ani" + } + process { + $cursor = [System.IO.File]::ReadAllBytes($busyCursorFolderPath) + if ($useAlternateDiff) { + $cursor = New-EditedCursor -Diff (Get-Content -Path "$DiffFolderPath\busy_light") -Cursor $cursor + } + else { + $cursor = New-EditedCursor -Diff (Get-Content -Path "$DiffFolderPath\busy") -Cursor $cursor + } + [System.IO.File]::WriteAllBytes($busyCursorFolderPath, $cursor) + + $cursor = [System.IO.File]::ReadAllBytes($workingCursorFolderPath) + $cursor = New-EditedCursor -Diff (Get-Content -Path "$DiffFolderPath\working") -Cursor $cursor + [System.IO.File]::WriteAllBytes($workingCursorFolderPath, $cursor) + } +} + +function Set-Cursor { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string]$Name, + + [Parameter(Mandatory)] + [string]$Path + ) + begin { + $Parameters = @{ + Path = 'HKCU:\Control Panel\Cursors' + Name = $Name + PropertyType = 'String' + Value = $Path + Force = $true + } + } + process { + New-ItemProperty @Parameters | Out-Null + } +} + +function Install-Cursors { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string]$Path + ) + process { + foreach ($cursor in (Get-ChildItem -Path $Path)) { + $targetPath = $cursor.FullName + switch -Exact ($cursor.Name) { + 'alternate.cur' { + Set-Cursor -Name 'UpArrow' -Path "$targetPath" + break + } + 'beam.cur' { + Set-Cursor -Name 'IBeam' -Path "$targetPath" + break + } + 'busy.ani' { + Set-Cursor -Name 'Wait' -Path "$targetPath" + break + } + 'dgn1.cur' { + Set-Cursor -Name 'SizeNWSE' -Path "$targetPath" + break + } + 'dgn2.cur' { + Set-Cursor -Name 'SizeNESW' -Path "$targetPath" + break + } + 'handwriting.cur' { + Set-Cursor -Name 'NWPen' -Path "$targetPath" + break + } + 'help.cur' { + Set-Cursor -Name 'Help' -Path "$targetPath" + break + } + 'horz.cur' { + Set-Cursor -Name 'SizeWE' -Path "$targetPath" + break + } + 'link.cur' { + Set-Cursor -Name 'Hand' -Path "$targetPath" + break + } + 'move.cur' { + Set-Cursor -Name 'SizeAll' -Path "$targetPath" + break + } + 'person.cur' { + Set-Cursor -Name 'Person' -Path "$targetPath" + break + } + 'pin.cur' { + Set-Cursor -Name 'Pin' -Path "$targetPath" + break + } + 'pointer.cur' { + Set-Cursor -Name 'Arrow' -Path "$targetPath" + break + } + 'precision.cur' { + Set-Cursor -Name 'Crosshair' -Path "$targetPath" + break + } + 'unavailable.cur' { + Set-Cursor -Name 'No' -Path "$targetPath" + break + } + 'vert.cur' { + Set-Cursor -Name 'SizeNS' -Path "$targetPath" + break + } + 'working.ani' { + Set-Cursor -Name 'AppStarting' -Path "$targetPath" + } + } + } + } +} + +function Reset-Cursor { + [CmdletBinding()] + param () + begin { + $defaultCursors = @( + @{ + Name = 'AppStarting' + Path = '%SystemRoot%\cursors\aero_working.ani' + }, + @{ + Name = 'Arrow' + Path = '%SystemRoot%\cursors\aero_arrow.cur' + }, + @{ + Name = 'Crosshair' + Path = '%SystemRoot%\cursors\aero_unavail.cur' + }, + @{ + Name = 'Hand' + Path = '%SystemRoot%\cursors\aero_link.cur' + }, + @{ + Name = 'Help' + Path = '%SystemRoot%\cursors\aero_helpsel.cur' + }, + @{ + Name = 'No' + Path = '%SystemRoot%\cursors\aero_unavail.cur' + }, + @{ + Name = 'NWPen' + Path = '%SystemRoot%\cursors\aero_pen.cur' + }, + @{ + Name = 'Person' + Path = '%SystemRoot%\cursors\aero_person.cur' + }, + @{ + Name = 'Pin' + Path = '%SystemRoot%\cursors\aero_pin.cur' + }, + @{ + Name = 'SizeAll' + Path = '%SystemRoot%\cursors\aero_move.cur' + }, + @{ + Name = 'SizeNESW' + Path = '%SystemRoot%\cursors\aero_nesw.cur' + }, + @{ + Name = 'SizeNS' + Path = '%SystemRoot%\cursors\aero_ns.cur' + }, + @{ + Name = 'SizeNWSE' + Path = '%SystemRoot%\cursors\aero_nwse.cur' + }, + @{ + Name = 'SizeWE' + Path = '%SystemRoot%\cursors\aero_ew.cur' + }, + @{ + Name = 'UpArrow' + Path = '%SystemRoot%\cursors\aero_up.cur' + }, + @{ + Name = 'Wait' + Path = '%SystemRoot%\cursors\aero_busy.ani' + } + ) + } + process { + $defaultCursors | ForEach-Object -Process { + Set-Cursor -Name $PSItem.Name -Path $PSItem.Path + } + $Parameters = @{ + Path = 'HKCU:\Control Panel\Cursors' + Name = 'IBeam' + PropertyType = 'String' + Value = $null + Force = $true + } + New-ItemProperty @Parameters | Out-Null + } +} + +function Update-Cursor { + [CmdletBinding()] + param () + begin { + Add-Type -TypeDefinition @' + using System; + using System.Runtime.InteropServices; + + public class Cursor { + [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] + public static extern bool SystemParametersInfo( + uint uiAction, + uint uiParam, + uint pvParam, + uint fWinIni + ); + + public static void Update() { + SystemParametersInfo(0x0057, 0, 0, 0x01 | 0x02); + } + } +'@ + } + process { + [Cursor]::Update() + } +} + +function Wait-RegistryKeyChange { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string]$Path, + + [ValidateSet('Name', 'Attributes', 'LastSet', 'Security', 'All')] + [string]$ChangeEvent = 'All' + ) + begin { + $infinite = 0xFFFFFFF + $handle = [IntPtr]::Zero + $notifyChangeName = 0x00000001L + $notifyChangeAttributes = 0x00000002L + $notifyChangeLastSet = 0x00000004L + $notifyChangeSecurity = 0x00000008L + + Add-Type -TypeDefinition @' + using System; + using System.Runtime.InteropServices; + + public class Regmon { + [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] + public static extern int RegOpenKeyExW( + int hKey, + string lpSubKey, + int ulOptions, + uint samDesired, + out IntPtr phkResult + ); + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] + public static extern int RegNotifyChangeKeyValue( + IntPtr hKey, + bool bWatchSubtree, + int dwNotifyFilter, + IntPtr hEvent, + bool fAsynchronous + ); + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] + public static extern int RegCloseKey( + IntPtr hKey + ); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern int CloseHandle( + IntPtr hKey + ); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern IntPtr CreateEventW( + int lpEventAttributes, + bool bManualReset, + bool bInitialState, + string lpName + ); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern int WaitForSingleObject( + IntPtr hHandle, + int dwMilliseconds + ); + } +'@ + } + process { + if (!(Test-Path -Path $Path)) { throw 'Registry key not found!' } + + switch -Wildcard ($Path) { + 'HKCR*' { $handle = 0x80000000 } + 'HKCU*' { $handle = 0x80000001 } + 'HKLM*' { $handle = 0x80000002 } + 'HKU*' { $handle = 0x80000003 } + Default { throw 'Unsuported hive!' } + } + + switch -Exact ($ChangeEvent) { + 'Name' { $notifyChange = $notifyChangeName } + 'Attributes' { $notifyChange = $notifyChangeAttributes } + 'LastSet' { $notifyChange = $notifyChangeLastSet } + 'Security' { $notifyChange = $notifyChangeSecurity } + 'All' { $notifyChange = $notifyChangeName -bor $notifyChangeAttributes -bor $notifyChangeLastSet -bor $notifyChangeSecurity } + } + + $regEvent = [Regmon]::CreateEventW($null, $true, $false, $null) + [Regmon]::RegOpenKeyExW($handle, ($Path -replace '^.*:\\'), 0, 0x0010, [ref]$handle) | Out-Null + [Regmon]::RegNotifyChangeKeyValue($handle, $false, $notifyChange, $regEvent, $true) | Out-Null + [Regmon]::WaitForSingleObject($regEvent, $infinite) | Out-Null + [Regmon]::CloseHandle($regEvent) | Out-Null + [Regmon]::RegCloseKey($handle) | Out-Null + } +} diff --git a/Install.ps1 b/Install.ps1 deleted file mode 100644 index 7e4dfe2..0000000 --- a/Install.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -#Requires -RunAsAdministrator -#Requires -Version 5.1 - -$ErrorActionPreference = 'Stop' -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - -if (Test-Path -Path $env:LocalAppData\CCS) { - Remove-Item -Path $env:LocalAppData\CCS -Recurse -Force | Out-Null -} - -$uri = 'https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer/releases/latest/download/Cursor-Colors-Synchronizer.zip' -Invoke-WebRequest -Uri $uri -OutFile $env:LocalAppData\Cursor-Colors-Synchronizer.zip -Expand-Archive -Path $env:LocalAppData\Cursor-Colors-Synchronizer.zip -DestinationPath $env:LocalAppData -Remove-Item -Path $env:LocalAppData\Cursor-Colors-Synchronizer.zip -Force - -Start-Process -FilePath powershell -ArgumentList "-ExecutionPolicy Bypass -NoExit -File $env:LocalAppData\CCS\CCS.ps1" \ No newline at end of file diff --git a/Installer.ps1 b/Installer.ps1 new file mode 100644 index 0000000..f5be608 --- /dev/null +++ b/Installer.ps1 @@ -0,0 +1,38 @@ +#region Preparation +$ErrorActionPreference = 'Stop' +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +$previousWindowTitle = $Host.UI.RawUI.WindowTitle +$Host.UI.RawUI.WindowTitle = 'Cursor Colors Synchronizer Installer' +#endregion Preparation + +#region Variables +$ccsFolder = "$env:LOCALAPPDATA\CCS" +$archivePath = "$env:TEMP\Cursor-Colors-Synchronizer.zip" +#endregion Variables + +#region Cleanup +Remove-Item -Path $ccsFolder -Recurse -Force -ErrorAction 'SilentlyContinue' | Out-Null +Remove-Item -Path $archivePath -Force -ErrorAction 'SilentlyContinue' | Out-Null +#endregion Cleanup + +#region Download +$Parameters = @{ + Uri = 'https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer/releases/latest/download/Cursor-Colors-Synchronizer.zip' + OutFile = $archivePath + UseBasicParsing = $true +} +Invoke-WebRequest @Parameters +#endregion Download + +#region Extraction +Expand-Archive -Path $archivePath -DestinationPath $env:LOCALAPPDATA -Force + +Remove-Item -Path $archivePath -Force +#endregion Extraction + +#region End +$Host.UI.RawUI.WindowTitle = $previousWindowTitle + +Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoExit -File $ccsFolder\CCS.ps1" +#endregion End diff --git a/Listener.ps1 b/Listener.ps1 index 5f35620..b2335de 100644 --- a/Listener.ps1 +++ b/Listener.ps1 @@ -1,66 +1,95 @@ -#Requires -RunAsAdministrator -#Requires -Version 5.1 - -#region Preparation -$ErrorActionPreference = 'Stop' -Remove-Module -Name Functions -ErrorAction SilentlyContinue -Clear-Variable -Name lastTheme, currentTheme, lastAccentColor, currentAccentColor, useClassicWheel, useAlternatePrecision, originalCursorFolder, customCursorFolder -ErrorAction SilentlyContinue -Import-Module -Name $PSScriptRoot\Functions.ps1 -#endregion Preparation - -#region Variables -$cursorSize = Get-Content -Path $PSScriptRoot\Resources\Preferences -First 1 -$useClassicWheel = Get-Content -Path $PSScriptRoot\Resources\Preferences -First 2 | Select-Object -Skip 1 -$useAlternatePrecision = Get-Content -Path $PSScriptRoot\Resources\Preferences -Last 1 -$byteDiffFolder = "$PSScriptRoot\Resources\Byte Diff\$cursorSize" -$customCursorFolder = "$PSScriptRoot\Resources\Custom Cursor" -$lastTheme = Get-WindowsTheme -$lastAccentColor = Get-WindowsAccentColor -#endregion Variables - -while (1) { - #region Theme - $currentTheme = Get-WindowsTheme - if ($lastTheme -ne $currentTheme) { - $originalCursorFolder = "$PSScriptRoot\Resources\Original Cursors\$currentTheme\$cursorSize" - Copy-Item -Path $originalCursorFolder\default\* -Destination $customCursorFolder -Recurse -Force - if ($useAlternatePrecision -eq $true) { - Copy-Item -Path $originalCursorFolder\alternatives\precision.cur -Destination $customCursorFolder -Force - } - if ($useClassicWheel -eq $false) { - if ( ($windowsTheme -eq 'light') -and ($cursorSize -eq 'big') ) { - Create-PatchedCursorFiles -CursorPath $customCursorFolder -DiffPath $byteDiffFolder -UseAlternateDiff $true - } - else { - Create-PatchedCursorFiles -CursorPath $customCursorFolder -DiffPath $byteDiffFolder - } - } - else { - Copy-Item -Path $originalCursorFolder\alternatives\busy.ani -Destination $customCursorFolder -Force - Copy-Item -Path $originalCursorFolder\alternatives\working.ani -Destination $customCursorFolder -Force - } - Install-CursorFromFolder -Path $customCursorFolder - Apply-Changes - $lastTheme = $currentTheme - } - #endregion Theme - - #region Accent Color - $currentAccentColor = Get-WindowsAccentColor - if ( ($lastAccentColor.R -ne $currentAccentColor.R) -or ($lastAccentColor.G -ne $currentAccentColor.G) -or ($lastAccentColor.B -ne $currentAccentColor.B) ) { - if ($useClassicWheel -eq $false) { - if ( ($windowsTheme -eq 'light') -and ($cursorSize -eq 'big') ) { - Create-PatchedCursorFiles -CursorPath $customCursorFolder -DiffPath $byteDiffFolder -UseAlternateDiff $true - } - else { - Create-PatchedCursorFiles $customCursorFolder $byteDiffFolder - } - Install-CursorFromFolder -Path $customCursorFolder - Apply-Changes - } - $lastAccentColor = $currentAccentColor - } - #endregion Accent Color - - Start-Sleep -Seconds 1 -} \ No newline at end of file +#Requires -RunAsAdministrator +#Requires -Version 5.1 + +#region Preparation +$ErrorActionPreference = 'Stop' +Remove-Job -Name 'CursorThemeSync' -Force -ErrorAction 'SilentlyContinue' +Remove-Job -Name 'CursorColorSync' -Force -ErrorAction 'SilentlyContinue' +#endregion Preparation + +#region Variables +$RootPath = $PSScriptRoot + +$prefsPath = "$RootPath\prefs" +$resourcesFolderPath = "$RootPath\Resources" +$cursorsFolderPath = "$resourcesFolderPath\Cursors" +$editedCursorFolderPath = "$cursorsFolderPath\Edited" + +$cursorSize = Get-Content -Path $prefsPath -First 1 +$useAlternatePrecision = [System.Convert]::ToBoolean($(Get-Content -Path $prefsPath -Last 1)) +$diffFolderPath = "$resourcesFolderPath\Diffs\$cursorSize" + +$themeSubKey = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize' +$accentColorSubKey = 'HKCU:\Software\Microsoft\Windows\DWM' +#endregion Variables + +#region Theme +$cursorThemeSyncScriptBlock = { + [CmdletBinding()] + param() + begin { + $ErrorActionPreference = 'Stop' + Import-Module -Name "$using:RootPath\Functions.psm1" -Force + } + process { + while (1) { + $lastTheme = Get-SystemTheme + Wait-RegistryKeyChange -Path $using:themeSubKey + $currentTheme = Get-SystemTheme + + if ($lastTheme -ne $currentTheme) { + $originalCursorFolderPath = "$using:cursorsFolderPath\Original\$currentTheme\$using:cursorSize" + + Copy-Item -Path "$originalCursorFolderPath\default\*" -Destination $using:editedCursorFolderPath -Recurse -Force + if ($using:useAlternatePrecision) { + Copy-Item -Path "$originalCursorFolderPath\alternatives\precision.cur" -Destination $using:editedCursorFolderPath -Force + } + + if (($currentTheme -eq 'light') -and ($using:cursorSize -eq 'big')) { + Edit-Cursors -Path $using:editedCursorFolderPath -DiffFolderPath $using:diffFolderPath -UseAlternateDiff + } + else { + Edit-Cursors -Path $using:editedCursorFolderPath -DiffFolderPath $using:diffFolderPath + } + + Install-Cursors -Path $using:editedCursorFolderPath + Update-Cursor + } + } + } +} +Start-Job -ScriptBlock $cursorThemeSyncScriptBlock -Name 'CursorThemeSync' | Out-Null +#endregion Theme + +#region Accent Color +$cursorColorSyncScriptBlock = { + [CmdletBinding()] + param() + begin { + $ErrorActionPreference = 'Stop' + Import-Module -Name "$using:RootPath\Functions.psm1" -Force + $currentTheme = Get-SystemTheme + } + process { + while (1) { + $lastAccentColor = Get-AccentColor + Wait-RegistryKeyChange -Path $using:accentColorSubKey + Start-Sleep -Seconds 1 + $currentAccentColor = Get-AccentColor + + if (($lastAccentColor | ConvertTo-Json) -ne ($currentAccentColor | ConvertTo-Json)) { + if (($currentTheme -eq 'light') -and ($using:cursorSize -eq 'big')) { + Edit-Cursors -Path $using:editedCursorFolderPath -DiffFolderPath $using:diffFolderPath -UseAlternateDiff + } + else { + Edit-Cursors -Path $using:editedCursorFolderPath -DiffFolderPath $using:diffFolderPath + } + + Install-Cursors -Path $using:editedCursorFolderPath + Update-Cursor + } + } + } +} +Start-Job -ScriptBlock $cursorColorSyncScriptBlock -Name 'CursorColorSync' | Out-Null +#endregion Accent Color diff --git a/Localizations/en-US/Strings.psd1 b/Localizations/en-US/Strings.psd1 index 93dc754..2ff313c 100644 --- a/Localizations/en-US/Strings.psd1 +++ b/Localizations/en-US/Strings.psd1 @@ -1,15 +1,14 @@ -ConvertFrom-StringData -StringData @' -Yes = Yes -No = No -ChooseDialogPromt = Your choice -ChooseSizeDialogTitle = Choose cursor size: -Small = Small -Regular = Regular -Big = Big -ChooseWheelDialogTitle = Use classic-style loading wheel? Accent color synchronization will be unavailable -ChoosePrecisionDialogTitle = Use alternate precision cursor? -ListenerDialogTitle = Enable background synchronization for cursor theme and accent color? -ListenerTaskDescription = Runs a script that synchronize cursor with the Windows theme and accent color in the background -SuccessMessage = Success, no errors! Enjoy. -GitHubReminderMessage = Do not forget to star project on GitHub if you liked it: https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer -'@ \ No newline at end of file +ConvertFrom-StringData -StringData @' +Yes = Yes +No = No +ChooseDialogPromt = Your choice +ChooseSizeDialogTitle = Choose cursor size: +Small = Small +Regular = Regular +Big = Big +ChoosePrecisionDialogTitle = Use alternate precision cursor? +ListenerDialogTitle = Enable background synchronization for cursor theme and accent color? +ListenerTaskDescription = Runs a script that synchronize cursor with the system theme and accent color in the background +SuccessMessage = Success! Enjoy. +GitHubReminderMessage = Do not forget to star project on GitHub if you liked it: https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer +'@ diff --git a/Localizations/ru-RU/Strings.psd1 b/Localizations/ru-RU/Strings.psd1 index 5ae7671..d97dd8d 100644 --- a/Localizations/ru-RU/Strings.psd1 +++ b/Localizations/ru-RU/Strings.psd1 @@ -1,15 +1,13 @@ -ConvertFrom-StringData -StringData @' -Yes = Да -No = Нет -ChooseDialogPromt = Ваш выбор -ChooseSizeDialogTitle = Выберите размер курсора: -Small = Маленький -Regular = Обычный -Big = Большой -ChooseWheelDialogTitle = Использовать классический стиль колеса загрузки? Cинхронизация акцентного цвета будет недоступна -ChoosePrecisionDialogTitle = Использовать альтернативный курсор для графического выделения? -ListenerDialogTitle = Синхронизировать тему и акцентный цвет курсора в фоновом режиме? -ListenerTaskDescription = Запускает скрипт, в фоне синхронизирующий курсор с темой и акцентным цветом Windows -SuccessMessage = Все выполнено успешно и без ошибок! -GitHubReminderMessage = Не забудьте оценить проект на GitHub, если вам понравилось: https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer -'@ \ No newline at end of file +ConvertFrom-StringData -StringData @' +Yes = Да +No = Нет +ChooseSizeDialogTitle = Выберите размер курсора: +Small = Маленький +Regular = Обычный +Big = Большой +ChoosePrecisionDialogTitle = Использовать альтернативный курсор для графического выделения? +ListenerDialogTitle = Синхронизировать тему и акцентный цвет курсора в фоновом режиме? +ListenerTaskDescription = Запускает скрипт, в фоне синхронизирующий курсор с темой и акцентным цветом Windows +SuccessMessage = Все выполнено без ошибок! +GitHubReminderMessage = Не забудьте оценить проект на GitHub, если он вам понравился: https://github.com/SunsetTechuila/Cursor-Colors-Synchronizer +'@ diff --git a/README.md b/README.md index d111e85..452b5cc 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,57 @@ -# Cursor Colors Synchronizer - -![CCS Banner](https://user-images.githubusercontent.com/115353812/218801534-51e90ae7-9867-488e-afc0-3002867662cb.png) - -## Description -A tiny PowerShell tool which will synchronize your cursor accent color and theme with the Windows ones. Uses paid version of -[Windows 11 Cursors Concept v2 pack](https://www.deviantart.com/jepricreations/art/Windows-11-Cursors-Concept-v2-886489356). - -#### Best match with: -- [Windows Auto Night Mode](https://github.com/AutoDarkMode/Windows-Auto-Night-Mode) -- [Light Switch](https://github.com/joakimmag/Light-Switch) -- Automatic accent color with: - - [WinDynamicDesktop](https://github.com/t1m0thyj/WinDynamicDesktop) - - [Bing Wallpaper](https://www.microsoft.com/en-us/bing/bing-wallpaper) - - Windows spotlight - - A slideshow - -## How to - -- ### Install -Run PowerShell as Administrator, paste this commands and press Enter -```powershell -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -IWR -UseB 'https://raw.githubusercontent.com/SunsetTechuila/Cursor-Colors-Synchronizer/main/Install.ps1' | IEX -``` - -- ### Use -Just read the installer prompts and choose what you want. - -- ### Uninstall -Run PowerShell as Administrator, paste this commands and press Enter -```powershell -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -IWR -UseB 'https://raw.githubusercontent.com/SunsetTechuila/Cursor-Colors-Synchronizer/main/Uninstall.ps1' | IEX -``` - -## Requirements -- Windows 7 or higher -- PowerShell 5.1 or higher -- Last Windows updates installed - -## Credits -- [Jepri Creations](https://jepricreations.com) for the cursors - -## Legal -I don't have a licence or permission from author to use that pack in this way. You can buy it on [ko-fi](https://ko-fi.com/s/d9f85e6821) for personal use. - -Due to illegal status of the repository I can't add a licence, but you can use my code for any purposes. +# Cursor Colors Synchronizer + +![CCS Banner](https://user-images.githubusercontent.com/115353812/218801534-51e90ae7-9867-488e-afc0-3002867662cb.png) + +## Description + +A PowerShell tool which will synchronize your cursor accent color and theme with the Windows ones. Uses paid version of +[Windows 11 Cursors Concept v2 pack](https://www.deviantart.com/jepricreations/art/Windows-11-Cursors-Concept-v2-886489356). + +#### Best match with + +- [Windows Auto Night Mode](https://github.com/AutoDarkMode/Windows-Auto-Night-Mode) +- [Light Switch](https://github.com/joakimmag/Light-Switch) +- Automatic accent color with: + - [WinDynamicDesktop](https://github.com/t1m0thyj/WinDynamicDesktop) + - [Bing Wallpaper](https://www.microsoft.com/en-us/bing/bing-wallpaper) + - Windows spotlight + - A slideshow + +## How to + +- ### Install + +Run PowerShell as Administrator, paste this commands and press Enter + +```powershell +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +iwr 'https://raw.githubusercontent.com/SunsetTechuila/Cursor-Colors-Synchronizer/master/Installer.ps1' -useb | iex +``` + +- ### Use + +Just read the installer prompts and choose what you want. + +- ### Uninstall + +Run PowerShell as Administrator, paste this commands and press Enter + +```powershell +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +iwr 'https://raw.githubusercontent.com/SunsetTechuila/Cursor-Colors-Synchronizer/master/Uninstaller.ps1' -useb | iex +``` + +## Requirements + +- Windows 7 or higher +- PowerShell 5.1 or higher + +## Credits + +- [Jepri Creations](https://jepricreations.com) for the cursors + +## Legal + +I don't have a licence or permission from author to use that pack in this way. You can buy it on [ko-fi](https://ko-fi.com/s/d9f85e6821) for personal use. + +You can use my code for any purposes. diff --git a/Resources/Original Cursors/dark/big/alternatives/precision.cur b/Resources/Cursors/Original/dark/big/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/big/alternatives/precision.cur rename to Resources/Cursors/Original/dark/big/alternatives/precision.cur diff --git a/Resources/Original Cursors/dark/big/default/alternate.cur b/Resources/Cursors/Original/dark/big/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/alternate.cur rename to Resources/Cursors/Original/dark/big/default/alternate.cur diff --git a/Resources/Original Cursors/dark/big/default/beam.cur b/Resources/Cursors/Original/dark/big/default/beam.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/beam.cur rename to Resources/Cursors/Original/dark/big/default/beam.cur diff --git a/Resources/Original Cursors/dark/big/default/busy.ani b/Resources/Cursors/Original/dark/big/default/busy.ani similarity index 100% rename from Resources/Original Cursors/dark/big/default/busy.ani rename to Resources/Cursors/Original/dark/big/default/busy.ani diff --git a/Resources/Original Cursors/dark/big/default/dgn1.cur b/Resources/Cursors/Original/dark/big/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/dgn1.cur rename to Resources/Cursors/Original/dark/big/default/dgn1.cur diff --git a/Resources/Original Cursors/dark/big/default/dgn2.cur b/Resources/Cursors/Original/dark/big/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/dgn2.cur rename to Resources/Cursors/Original/dark/big/default/dgn2.cur diff --git a/Resources/Original Cursors/dark/big/default/handwriting.cur b/Resources/Cursors/Original/dark/big/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/handwriting.cur rename to Resources/Cursors/Original/dark/big/default/handwriting.cur diff --git a/Resources/Original Cursors/dark/big/default/help.cur b/Resources/Cursors/Original/dark/big/default/help.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/help.cur rename to Resources/Cursors/Original/dark/big/default/help.cur diff --git a/Resources/Original Cursors/dark/big/default/horz.cur b/Resources/Cursors/Original/dark/big/default/horz.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/horz.cur rename to Resources/Cursors/Original/dark/big/default/horz.cur diff --git a/Resources/Original Cursors/dark/big/default/link.cur b/Resources/Cursors/Original/dark/big/default/link.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/link.cur rename to Resources/Cursors/Original/dark/big/default/link.cur diff --git a/Resources/Original Cursors/dark/big/default/move.cur b/Resources/Cursors/Original/dark/big/default/move.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/move.cur rename to Resources/Cursors/Original/dark/big/default/move.cur diff --git a/Resources/Original Cursors/dark/big/default/person.cur b/Resources/Cursors/Original/dark/big/default/person.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/person.cur rename to Resources/Cursors/Original/dark/big/default/person.cur diff --git a/Resources/Original Cursors/dark/big/default/pin.cur b/Resources/Cursors/Original/dark/big/default/pin.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/pin.cur rename to Resources/Cursors/Original/dark/big/default/pin.cur diff --git a/Resources/Original Cursors/dark/big/default/pointer.cur b/Resources/Cursors/Original/dark/big/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/pointer.cur rename to Resources/Cursors/Original/dark/big/default/pointer.cur diff --git a/Resources/Original Cursors/dark/big/default/precision.cur b/Resources/Cursors/Original/dark/big/default/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/precision.cur rename to Resources/Cursors/Original/dark/big/default/precision.cur diff --git a/Resources/Original Cursors/dark/big/default/unavailable.cur b/Resources/Cursors/Original/dark/big/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/unavailable.cur rename to Resources/Cursors/Original/dark/big/default/unavailable.cur diff --git a/Resources/Original Cursors/dark/big/default/vert.cur b/Resources/Cursors/Original/dark/big/default/vert.cur similarity index 100% rename from Resources/Original Cursors/dark/big/default/vert.cur rename to Resources/Cursors/Original/dark/big/default/vert.cur diff --git a/Resources/Original Cursors/dark/big/default/working.ani b/Resources/Cursors/Original/dark/big/default/working.ani similarity index 100% rename from Resources/Original Cursors/dark/big/default/working.ani rename to Resources/Cursors/Original/dark/big/default/working.ani diff --git a/Resources/Original Cursors/dark/regular/alternatives/precision.cur b/Resources/Cursors/Original/dark/regular/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/alternatives/precision.cur rename to Resources/Cursors/Original/dark/regular/alternatives/precision.cur diff --git a/Resources/Original Cursors/dark/regular/default/alternate.cur b/Resources/Cursors/Original/dark/regular/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/alternate.cur rename to Resources/Cursors/Original/dark/regular/default/alternate.cur diff --git a/Resources/Original Cursors/dark/regular/default/beam.cur b/Resources/Cursors/Original/dark/regular/default/beam.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/beam.cur rename to Resources/Cursors/Original/dark/regular/default/beam.cur diff --git a/Resources/Original Cursors/dark/regular/default/busy.ani b/Resources/Cursors/Original/dark/regular/default/busy.ani similarity index 100% rename from Resources/Original Cursors/dark/regular/default/busy.ani rename to Resources/Cursors/Original/dark/regular/default/busy.ani diff --git a/Resources/Original Cursors/dark/regular/default/dgn1.cur b/Resources/Cursors/Original/dark/regular/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/dgn1.cur rename to Resources/Cursors/Original/dark/regular/default/dgn1.cur diff --git a/Resources/Original Cursors/dark/regular/default/dgn2.cur b/Resources/Cursors/Original/dark/regular/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/dgn2.cur rename to Resources/Cursors/Original/dark/regular/default/dgn2.cur diff --git a/Resources/Original Cursors/dark/regular/default/handwriting.cur b/Resources/Cursors/Original/dark/regular/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/handwriting.cur rename to Resources/Cursors/Original/dark/regular/default/handwriting.cur diff --git a/Resources/Original Cursors/dark/regular/default/help.cur b/Resources/Cursors/Original/dark/regular/default/help.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/help.cur rename to Resources/Cursors/Original/dark/regular/default/help.cur diff --git a/Resources/Original Cursors/dark/regular/default/horz.cur b/Resources/Cursors/Original/dark/regular/default/horz.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/horz.cur rename to Resources/Cursors/Original/dark/regular/default/horz.cur diff --git a/Resources/Original Cursors/dark/regular/default/link.cur b/Resources/Cursors/Original/dark/regular/default/link.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/link.cur rename to Resources/Cursors/Original/dark/regular/default/link.cur diff --git a/Resources/Original Cursors/dark/regular/default/move.cur b/Resources/Cursors/Original/dark/regular/default/move.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/move.cur rename to Resources/Cursors/Original/dark/regular/default/move.cur diff --git a/Resources/Original Cursors/dark/regular/default/person.cur b/Resources/Cursors/Original/dark/regular/default/person.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/person.cur rename to Resources/Cursors/Original/dark/regular/default/person.cur diff --git a/Resources/Original Cursors/dark/regular/default/pin.cur b/Resources/Cursors/Original/dark/regular/default/pin.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/pin.cur rename to Resources/Cursors/Original/dark/regular/default/pin.cur diff --git a/Resources/Original Cursors/dark/regular/default/pointer.cur b/Resources/Cursors/Original/dark/regular/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/pointer.cur rename to Resources/Cursors/Original/dark/regular/default/pointer.cur diff --git a/Resources/Original Cursors/dark/regular/default/precision.cur b/Resources/Cursors/Original/dark/regular/default/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/precision.cur rename to Resources/Cursors/Original/dark/regular/default/precision.cur diff --git a/Resources/Original Cursors/dark/regular/default/unavailable.cur b/Resources/Cursors/Original/dark/regular/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/unavailable.cur rename to Resources/Cursors/Original/dark/regular/default/unavailable.cur diff --git a/Resources/Original Cursors/dark/regular/default/vert.cur b/Resources/Cursors/Original/dark/regular/default/vert.cur similarity index 100% rename from Resources/Original Cursors/dark/regular/default/vert.cur rename to Resources/Cursors/Original/dark/regular/default/vert.cur diff --git a/Resources/Original Cursors/dark/regular/default/working.ani b/Resources/Cursors/Original/dark/regular/default/working.ani similarity index 100% rename from Resources/Original Cursors/dark/regular/default/working.ani rename to Resources/Cursors/Original/dark/regular/default/working.ani diff --git a/Resources/Original Cursors/dark/small/alternatives/precision.cur b/Resources/Cursors/Original/dark/small/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/small/alternatives/precision.cur rename to Resources/Cursors/Original/dark/small/alternatives/precision.cur diff --git a/Resources/Original Cursors/dark/small/default/alternate.cur b/Resources/Cursors/Original/dark/small/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/alternate.cur rename to Resources/Cursors/Original/dark/small/default/alternate.cur diff --git a/Resources/Original Cursors/dark/small/default/beam.cur b/Resources/Cursors/Original/dark/small/default/beam.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/beam.cur rename to Resources/Cursors/Original/dark/small/default/beam.cur diff --git a/Resources/Original Cursors/dark/small/default/busy.ani b/Resources/Cursors/Original/dark/small/default/busy.ani similarity index 100% rename from Resources/Original Cursors/dark/small/default/busy.ani rename to Resources/Cursors/Original/dark/small/default/busy.ani diff --git a/Resources/Original Cursors/dark/small/default/dgn1.cur b/Resources/Cursors/Original/dark/small/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/dgn1.cur rename to Resources/Cursors/Original/dark/small/default/dgn1.cur diff --git a/Resources/Original Cursors/dark/small/default/dgn2.cur b/Resources/Cursors/Original/dark/small/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/dgn2.cur rename to Resources/Cursors/Original/dark/small/default/dgn2.cur diff --git a/Resources/Original Cursors/dark/small/default/handwriting.cur b/Resources/Cursors/Original/dark/small/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/handwriting.cur rename to Resources/Cursors/Original/dark/small/default/handwriting.cur diff --git a/Resources/Original Cursors/dark/small/default/help.cur b/Resources/Cursors/Original/dark/small/default/help.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/help.cur rename to Resources/Cursors/Original/dark/small/default/help.cur diff --git a/Resources/Original Cursors/dark/small/default/horz.cur b/Resources/Cursors/Original/dark/small/default/horz.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/horz.cur rename to Resources/Cursors/Original/dark/small/default/horz.cur diff --git a/Resources/Original Cursors/dark/small/default/link.cur b/Resources/Cursors/Original/dark/small/default/link.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/link.cur rename to Resources/Cursors/Original/dark/small/default/link.cur diff --git a/Resources/Original Cursors/dark/small/default/move.cur b/Resources/Cursors/Original/dark/small/default/move.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/move.cur rename to Resources/Cursors/Original/dark/small/default/move.cur diff --git a/Resources/Original Cursors/dark/small/default/person.cur b/Resources/Cursors/Original/dark/small/default/person.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/person.cur rename to Resources/Cursors/Original/dark/small/default/person.cur diff --git a/Resources/Original Cursors/dark/small/default/pin.cur b/Resources/Cursors/Original/dark/small/default/pin.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/pin.cur rename to Resources/Cursors/Original/dark/small/default/pin.cur diff --git a/Resources/Original Cursors/dark/small/default/pointer.cur b/Resources/Cursors/Original/dark/small/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/pointer.cur rename to Resources/Cursors/Original/dark/small/default/pointer.cur diff --git a/Resources/Original Cursors/dark/small/default/precision.cur b/Resources/Cursors/Original/dark/small/default/precision.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/precision.cur rename to Resources/Cursors/Original/dark/small/default/precision.cur diff --git a/Resources/Original Cursors/dark/small/default/unavailable.cur b/Resources/Cursors/Original/dark/small/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/unavailable.cur rename to Resources/Cursors/Original/dark/small/default/unavailable.cur diff --git a/Resources/Original Cursors/dark/small/default/vert.cur b/Resources/Cursors/Original/dark/small/default/vert.cur similarity index 100% rename from Resources/Original Cursors/dark/small/default/vert.cur rename to Resources/Cursors/Original/dark/small/default/vert.cur diff --git a/Resources/Original Cursors/dark/small/default/working.ani b/Resources/Cursors/Original/dark/small/default/working.ani similarity index 100% rename from Resources/Original Cursors/dark/small/default/working.ani rename to Resources/Cursors/Original/dark/small/default/working.ani diff --git a/Resources/Original Cursors/light/big/alternatives/precision.cur b/Resources/Cursors/Original/light/big/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/light/big/alternatives/precision.cur rename to Resources/Cursors/Original/light/big/alternatives/precision.cur diff --git a/Resources/Original Cursors/light/big/default/alternate.cur b/Resources/Cursors/Original/light/big/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/alternate.cur rename to Resources/Cursors/Original/light/big/default/alternate.cur diff --git a/Resources/Original Cursors/light/big/default/beam.cur b/Resources/Cursors/Original/light/big/default/beam.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/beam.cur rename to Resources/Cursors/Original/light/big/default/beam.cur diff --git a/Resources/Original Cursors/light/big/default/busy.ani b/Resources/Cursors/Original/light/big/default/busy.ani similarity index 100% rename from Resources/Original Cursors/light/big/default/busy.ani rename to Resources/Cursors/Original/light/big/default/busy.ani diff --git a/Resources/Original Cursors/light/big/default/dgn1.cur b/Resources/Cursors/Original/light/big/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/dgn1.cur rename to Resources/Cursors/Original/light/big/default/dgn1.cur diff --git a/Resources/Original Cursors/light/big/default/dgn2.cur b/Resources/Cursors/Original/light/big/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/dgn2.cur rename to Resources/Cursors/Original/light/big/default/dgn2.cur diff --git a/Resources/Original Cursors/light/big/default/handwriting.cur b/Resources/Cursors/Original/light/big/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/handwriting.cur rename to Resources/Cursors/Original/light/big/default/handwriting.cur diff --git a/Resources/Original Cursors/light/big/default/help.cur b/Resources/Cursors/Original/light/big/default/help.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/help.cur rename to Resources/Cursors/Original/light/big/default/help.cur diff --git a/Resources/Original Cursors/light/big/default/horz.cur b/Resources/Cursors/Original/light/big/default/horz.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/horz.cur rename to Resources/Cursors/Original/light/big/default/horz.cur diff --git a/Resources/Original Cursors/light/big/default/link.cur b/Resources/Cursors/Original/light/big/default/link.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/link.cur rename to Resources/Cursors/Original/light/big/default/link.cur diff --git a/Resources/Original Cursors/light/big/default/move.cur b/Resources/Cursors/Original/light/big/default/move.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/move.cur rename to Resources/Cursors/Original/light/big/default/move.cur diff --git a/Resources/Original Cursors/light/big/default/person.cur b/Resources/Cursors/Original/light/big/default/person.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/person.cur rename to Resources/Cursors/Original/light/big/default/person.cur diff --git a/Resources/Original Cursors/light/big/default/pin.cur b/Resources/Cursors/Original/light/big/default/pin.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/pin.cur rename to Resources/Cursors/Original/light/big/default/pin.cur diff --git a/Resources/Original Cursors/light/big/default/pointer.cur b/Resources/Cursors/Original/light/big/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/pointer.cur rename to Resources/Cursors/Original/light/big/default/pointer.cur diff --git a/Resources/Original Cursors/light/big/default/precision.cur b/Resources/Cursors/Original/light/big/default/precision.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/precision.cur rename to Resources/Cursors/Original/light/big/default/precision.cur diff --git a/Resources/Original Cursors/light/big/default/unavailable.cur b/Resources/Cursors/Original/light/big/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/unavailable.cur rename to Resources/Cursors/Original/light/big/default/unavailable.cur diff --git a/Resources/Original Cursors/light/big/default/vert.cur b/Resources/Cursors/Original/light/big/default/vert.cur similarity index 100% rename from Resources/Original Cursors/light/big/default/vert.cur rename to Resources/Cursors/Original/light/big/default/vert.cur diff --git a/Resources/Original Cursors/light/big/default/working.ani b/Resources/Cursors/Original/light/big/default/working.ani similarity index 100% rename from Resources/Original Cursors/light/big/default/working.ani rename to Resources/Cursors/Original/light/big/default/working.ani diff --git a/Resources/Original Cursors/light/regular/alternatives/precision.cur b/Resources/Cursors/Original/light/regular/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/light/regular/alternatives/precision.cur rename to Resources/Cursors/Original/light/regular/alternatives/precision.cur diff --git a/Resources/Original Cursors/light/regular/default/alternate.cur b/Resources/Cursors/Original/light/regular/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/alternate.cur rename to Resources/Cursors/Original/light/regular/default/alternate.cur diff --git a/Resources/Original Cursors/light/regular/default/beam.cur b/Resources/Cursors/Original/light/regular/default/beam.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/beam.cur rename to Resources/Cursors/Original/light/regular/default/beam.cur diff --git a/Resources/Original Cursors/light/regular/default/busy.ani b/Resources/Cursors/Original/light/regular/default/busy.ani similarity index 100% rename from Resources/Original Cursors/light/regular/default/busy.ani rename to Resources/Cursors/Original/light/regular/default/busy.ani diff --git a/Resources/Original Cursors/light/regular/default/dgn1.cur b/Resources/Cursors/Original/light/regular/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/dgn1.cur rename to Resources/Cursors/Original/light/regular/default/dgn1.cur diff --git a/Resources/Original Cursors/light/regular/default/dgn2.cur b/Resources/Cursors/Original/light/regular/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/dgn2.cur rename to Resources/Cursors/Original/light/regular/default/dgn2.cur diff --git a/Resources/Original Cursors/light/regular/default/handwriting.cur b/Resources/Cursors/Original/light/regular/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/handwriting.cur rename to Resources/Cursors/Original/light/regular/default/handwriting.cur diff --git a/Resources/Original Cursors/light/regular/default/help.cur b/Resources/Cursors/Original/light/regular/default/help.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/help.cur rename to Resources/Cursors/Original/light/regular/default/help.cur diff --git a/Resources/Original Cursors/light/regular/default/horz.cur b/Resources/Cursors/Original/light/regular/default/horz.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/horz.cur rename to Resources/Cursors/Original/light/regular/default/horz.cur diff --git a/Resources/Original Cursors/light/regular/default/link.cur b/Resources/Cursors/Original/light/regular/default/link.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/link.cur rename to Resources/Cursors/Original/light/regular/default/link.cur diff --git a/Resources/Original Cursors/light/regular/default/move.cur b/Resources/Cursors/Original/light/regular/default/move.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/move.cur rename to Resources/Cursors/Original/light/regular/default/move.cur diff --git a/Resources/Original Cursors/light/regular/default/person.cur b/Resources/Cursors/Original/light/regular/default/person.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/person.cur rename to Resources/Cursors/Original/light/regular/default/person.cur diff --git a/Resources/Original Cursors/light/regular/default/pin.cur b/Resources/Cursors/Original/light/regular/default/pin.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/pin.cur rename to Resources/Cursors/Original/light/regular/default/pin.cur diff --git a/Resources/Original Cursors/light/regular/default/pointer.cur b/Resources/Cursors/Original/light/regular/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/pointer.cur rename to Resources/Cursors/Original/light/regular/default/pointer.cur diff --git a/Resources/Original Cursors/light/regular/default/precision.cur b/Resources/Cursors/Original/light/regular/default/precision.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/precision.cur rename to Resources/Cursors/Original/light/regular/default/precision.cur diff --git a/Resources/Original Cursors/light/regular/default/unavailable.cur b/Resources/Cursors/Original/light/regular/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/unavailable.cur rename to Resources/Cursors/Original/light/regular/default/unavailable.cur diff --git a/Resources/Original Cursors/light/regular/default/vert.cur b/Resources/Cursors/Original/light/regular/default/vert.cur similarity index 100% rename from Resources/Original Cursors/light/regular/default/vert.cur rename to Resources/Cursors/Original/light/regular/default/vert.cur diff --git a/Resources/Original Cursors/light/regular/default/working.ani b/Resources/Cursors/Original/light/regular/default/working.ani similarity index 100% rename from Resources/Original Cursors/light/regular/default/working.ani rename to Resources/Cursors/Original/light/regular/default/working.ani diff --git a/Resources/Original Cursors/light/small/alternatives/precision.cur b/Resources/Cursors/Original/light/small/alternatives/precision.cur similarity index 100% rename from Resources/Original Cursors/light/small/alternatives/precision.cur rename to Resources/Cursors/Original/light/small/alternatives/precision.cur diff --git a/Resources/Original Cursors/light/small/default/alternate.cur b/Resources/Cursors/Original/light/small/default/alternate.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/alternate.cur rename to Resources/Cursors/Original/light/small/default/alternate.cur diff --git a/Resources/Original Cursors/light/small/default/beam.cur b/Resources/Cursors/Original/light/small/default/beam.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/beam.cur rename to Resources/Cursors/Original/light/small/default/beam.cur diff --git a/Resources/Original Cursors/light/small/default/busy.ani b/Resources/Cursors/Original/light/small/default/busy.ani similarity index 100% rename from Resources/Original Cursors/light/small/default/busy.ani rename to Resources/Cursors/Original/light/small/default/busy.ani diff --git a/Resources/Original Cursors/light/small/default/dgn1.cur b/Resources/Cursors/Original/light/small/default/dgn1.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/dgn1.cur rename to Resources/Cursors/Original/light/small/default/dgn1.cur diff --git a/Resources/Original Cursors/light/small/default/dgn2.cur b/Resources/Cursors/Original/light/small/default/dgn2.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/dgn2.cur rename to Resources/Cursors/Original/light/small/default/dgn2.cur diff --git a/Resources/Original Cursors/light/small/default/handwriting.cur b/Resources/Cursors/Original/light/small/default/handwriting.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/handwriting.cur rename to Resources/Cursors/Original/light/small/default/handwriting.cur diff --git a/Resources/Original Cursors/light/small/default/help.cur b/Resources/Cursors/Original/light/small/default/help.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/help.cur rename to Resources/Cursors/Original/light/small/default/help.cur diff --git a/Resources/Original Cursors/light/small/default/horz.cur b/Resources/Cursors/Original/light/small/default/horz.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/horz.cur rename to Resources/Cursors/Original/light/small/default/horz.cur diff --git a/Resources/Original Cursors/light/small/default/link.cur b/Resources/Cursors/Original/light/small/default/link.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/link.cur rename to Resources/Cursors/Original/light/small/default/link.cur diff --git a/Resources/Original Cursors/light/small/default/move.cur b/Resources/Cursors/Original/light/small/default/move.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/move.cur rename to Resources/Cursors/Original/light/small/default/move.cur diff --git a/Resources/Original Cursors/light/small/default/person.cur b/Resources/Cursors/Original/light/small/default/person.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/person.cur rename to Resources/Cursors/Original/light/small/default/person.cur diff --git a/Resources/Original Cursors/light/small/default/pin.cur b/Resources/Cursors/Original/light/small/default/pin.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/pin.cur rename to Resources/Cursors/Original/light/small/default/pin.cur diff --git a/Resources/Original Cursors/light/small/default/pointer.cur b/Resources/Cursors/Original/light/small/default/pointer.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/pointer.cur rename to Resources/Cursors/Original/light/small/default/pointer.cur diff --git a/Resources/Original Cursors/light/small/default/precision.cur b/Resources/Cursors/Original/light/small/default/precision.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/precision.cur rename to Resources/Cursors/Original/light/small/default/precision.cur diff --git a/Resources/Original Cursors/light/small/default/unavailable.cur b/Resources/Cursors/Original/light/small/default/unavailable.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/unavailable.cur rename to Resources/Cursors/Original/light/small/default/unavailable.cur diff --git a/Resources/Original Cursors/light/small/default/vert.cur b/Resources/Cursors/Original/light/small/default/vert.cur similarity index 100% rename from Resources/Original Cursors/light/small/default/vert.cur rename to Resources/Cursors/Original/light/small/default/vert.cur diff --git a/Resources/Original Cursors/light/small/default/working.ani b/Resources/Cursors/Original/light/small/default/working.ani similarity index 100% rename from Resources/Original Cursors/light/small/default/working.ani rename to Resources/Cursors/Original/light/small/default/working.ani diff --git a/Resources/Byte Diff/big/busy b/Resources/Diffs/big/busy similarity index 100% rename from Resources/Byte Diff/big/busy rename to Resources/Diffs/big/busy diff --git a/Resources/Byte Diff/big/busy_light b/Resources/Diffs/big/busy_light similarity index 100% rename from Resources/Byte Diff/big/busy_light rename to Resources/Diffs/big/busy_light diff --git a/Resources/Byte Diff/big/working b/Resources/Diffs/big/working similarity index 100% rename from Resources/Byte Diff/big/working rename to Resources/Diffs/big/working diff --git a/Resources/Byte Diff/regular/busy b/Resources/Diffs/regular/busy similarity index 100% rename from Resources/Byte Diff/regular/busy rename to Resources/Diffs/regular/busy diff --git a/Resources/Byte Diff/regular/working b/Resources/Diffs/regular/working similarity index 100% rename from Resources/Byte Diff/regular/working rename to Resources/Diffs/regular/working diff --git a/Resources/Byte Diff/small/busy b/Resources/Diffs/small/busy similarity index 100% rename from Resources/Byte Diff/small/busy rename to Resources/Diffs/small/busy diff --git a/Resources/Byte Diff/small/working b/Resources/Diffs/small/working similarity index 100% rename from Resources/Byte Diff/small/working rename to Resources/Diffs/small/working diff --git a/Resources/Original Cursors/dark/big/alternatives/busy.ani b/Resources/Original Cursors/dark/big/alternatives/busy.ani deleted file mode 100644 index 0ff7755..0000000 Binary files a/Resources/Original Cursors/dark/big/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/dark/big/alternatives/working.ani b/Resources/Original Cursors/dark/big/alternatives/working.ani deleted file mode 100644 index fd26d24..0000000 Binary files a/Resources/Original Cursors/dark/big/alternatives/working.ani and /dev/null differ diff --git a/Resources/Original Cursors/dark/regular/alternatives/busy.ani b/Resources/Original Cursors/dark/regular/alternatives/busy.ani deleted file mode 100644 index 55d0b84..0000000 Binary files a/Resources/Original Cursors/dark/regular/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/dark/regular/alternatives/working.ani b/Resources/Original Cursors/dark/regular/alternatives/working.ani deleted file mode 100644 index 4783eb2..0000000 Binary files a/Resources/Original Cursors/dark/regular/alternatives/working.ani and /dev/null differ diff --git a/Resources/Original Cursors/dark/small/alternatives/busy.ani b/Resources/Original Cursors/dark/small/alternatives/busy.ani deleted file mode 100644 index 55d0b84..0000000 Binary files a/Resources/Original Cursors/dark/small/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/dark/small/alternatives/working.ani b/Resources/Original Cursors/dark/small/alternatives/working.ani deleted file mode 100644 index 234ad6a..0000000 Binary files a/Resources/Original Cursors/dark/small/alternatives/working.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/big/alternatives/busy.ani b/Resources/Original Cursors/light/big/alternatives/busy.ani deleted file mode 100644 index 0ff7755..0000000 Binary files a/Resources/Original Cursors/light/big/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/big/alternatives/working.ani b/Resources/Original Cursors/light/big/alternatives/working.ani deleted file mode 100644 index 5792695..0000000 Binary files a/Resources/Original Cursors/light/big/alternatives/working.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/regular/alternatives/busy.ani b/Resources/Original Cursors/light/regular/alternatives/busy.ani deleted file mode 100644 index 55d0b84..0000000 Binary files a/Resources/Original Cursors/light/regular/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/regular/alternatives/working.ani b/Resources/Original Cursors/light/regular/alternatives/working.ani deleted file mode 100644 index 7db4ea0..0000000 Binary files a/Resources/Original Cursors/light/regular/alternatives/working.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/small/alternatives/busy.ani b/Resources/Original Cursors/light/small/alternatives/busy.ani deleted file mode 100644 index 55d0b84..0000000 Binary files a/Resources/Original Cursors/light/small/alternatives/busy.ani and /dev/null differ diff --git a/Resources/Original Cursors/light/small/alternatives/working.ani b/Resources/Original Cursors/light/small/alternatives/working.ani deleted file mode 100644 index b460ed9..0000000 Binary files a/Resources/Original Cursors/light/small/alternatives/working.ani and /dev/null differ diff --git a/Uninstall.ps1 b/Uninstall.ps1 deleted file mode 100644 index 5cc8ccc..0000000 --- a/Uninstall.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -#Requires -RunAsAdministrator -#Requires -Version 5.1 - -$ErrorActionPreference = 'Stop' -[Console]::Title = 'CCS Uninstaller' -$ccsFolder = "$env:LocalAppData\CCS" - -if ( -not (Test-Path -Path $ccsFolder) ) { - Write-Host - Write-Host 'CCS is not installed!' -ForegroundColor Red - Write-Host - Pause - exit -} - -Remove-Module -Name Functions -ErrorAction SilentlyContinue -Import-Module -Name $ccsFolder\Functions.ps1 - -Stop-ScheduledTask -TaskName 'CCS Listener' -ErrorAction SilentlyContinue -Unregister-ScheduledTask -TaskName 'CCS Listener' -Confirm:$false -ErrorAction SilentlyContinue - -Restore-DefaultCursor -Apply-Changes - -Remove-Module -Name Functions -Remove-Item -Path $ccsFolder -Recurse -Force | Out-Null \ No newline at end of file diff --git a/Uninstaller.ps1 b/Uninstaller.ps1 new file mode 100644 index 0000000..2c39bc8 --- /dev/null +++ b/Uninstaller.ps1 @@ -0,0 +1,30 @@ +#region Preparation +$ErrorActionPreference = 'Stop' +$ccsFolder = "$env:LOCALAPPDATA\CCS" +#endregion Preparation + +#region Stop Scheduled Task +Stop-ScheduledTask -TaskName 'CCS Listener' -ErrorAction 'SilentlyContinue' +Unregister-ScheduledTask -TaskName 'CCS Listener' -Confirm $false -ErrorAction 'SilentlyContinue' +#endregion Stop Scheduled Task + +#region Check Installation +if (-not (Test-Path -Path $ccsFolder -PathType 'Container')) { + Clear-Host + Write-Warning -Message "Can't find CCS files!" + Pause + exit +} +#endregion Check Installation + +#region Restore Cursor +Import-Module -Name "$ccsFolder\Functions.psm1" -Force + +Reset-Cursor +Update-Cursor +#endregion Restore Cursor + +#region Cleanup +Remove-Module -Name 'Functions' -Force +Remove-Item -Path $ccsFolder -Recurse -Force +#endregion Cleanup