46 Commits

Author SHA1 Message Date
jazir5
c1b57ca1ca Add files via upload 2025-10-17 17:03:30 -07:00
jazir5
933adbd879 Delete steam.manifest 2025-10-17 16:59:17 -07:00
jazir5
d1e04f0cc3 Delete Set explorer as shell.bat 2025-10-17 16:59:10 -07:00
jazir5
99cdee8922 Delete Enable GamesDows Steam V3.bat 2025-10-17 16:58:54 -07:00
jazir5
86af54176e Delete Enable GamesDows Playnite.bat 2025-10-17 16:58:43 -07:00
jazir5
2611bb861f Delete Disable Gamesdows V3.bat 2025-10-17 16:58:33 -07:00
jazir5
0006eefd9f Update README.md 2025-10-17 16:21:51 -07:00
jazir5
7426d4a5e9 Removed Decky 2025-10-17 16:16:00 -07:00
jazir5
3b6b073b89 Update Enable GamesDows Playnite.bat 2025-10-17 16:15:05 -07:00
jazir5
e69d1db9b1 Fix XML echo commands and update schtasks command 2025-10-17 16:13:15 -07:00
jazir5
a8cee33437 Update README.md 2025-09-05 15:48:05 -07:00
jazir5
bf08fb5546 Update Enable GamesDows Playnite.bat 2025-03-05 22:42:39 -08:00
jazir5
5fe58bc56a Update Enable GamesDows Steam V3.bat 2025-03-05 22:42:16 -08:00
jazir5
3689b68215 Update Enable GamesDows Steam V3.bat 2025-03-05 22:41:55 -08:00
jazir5
87c64e1313 Update Enable GamesDows Playnite.bat 2025-03-05 22:41:28 -08:00
jazir5
0dfeccd96d Update Enable GamesDows Steam V3.bat 2025-03-05 22:39:59 -08:00
jazir5
88d9e2972a Update Enable GamesDows Playnite.bat 2025-03-05 22:25:03 -08:00
jazir5
cb9218a3d0 Update Enable GamesDows Steam V3.bat 2025-03-05 22:23:39 -08:00
jazir5
24a9f0e798 Update Enable GamesDows Steam V3.bat 2025-03-05 22:21:10 -08:00
jazir5
f98ba713bd Create steam.manifest 2025-03-05 22:13:28 -08:00
jazir5
89f4b71825 Delete manifests directory 2025-03-05 22:13:14 -08:00
jazir5
785a97b697 Create steam.manifest 2025-03-05 22:12:38 -08:00
jazir5
9f62c88fc1 Update Disable Gamesdows V3.bat 2025-03-05 15:36:45 -08:00
jazir5
56c5b6a91e Update Enable GamesDows Playnite.bat 2025-03-05 15:27:29 -08:00
jazir5
fafd7a2010 Update Enable GamesDows Steam V3.bat 2025-02-15 15:31:18 -08:00
jazir5
1ca95e4131 Update Enable GamesDows Playnite.bat 2025-02-15 15:31:06 -08:00
jazir5
d3ee9e4289 Delete decky/Placeholder 2024-12-28 16:43:39 -08:00
jazir5
dd07d9550c Delete decky_builder.py 2024-12-28 16:36:05 -08:00
jazir5
5be5761019 Delete install_decky.bat 2024-12-28 16:35:55 -08:00
jazir5
12e28325c8 Initial Decky Loader Installer Release 2024-12-28 16:35:45 -08:00
jazir5
3220a3b457 Create Placeholder 2024-12-28 16:34:49 -08:00
jazir5
3f5e0a43fd Update Enable GamesDows Steam V3.bat 2024-12-28 16:27:42 -08:00
jazir5
009602191a Rename Set explorer as shell.reg to Set explorer as shell.bat 2024-12-28 02:28:12 -08:00
jazir5
ba9c7779e2 Update Enable GamesDows Steam V3.bat 2024-12-28 02:24:37 -08:00
jazir5
d7d936c495 Update Enable GamesDows Steam V3.bat 2024-12-28 02:22:53 -08:00
jazir5
ea2d0cb5f1 Update Disable Gamesdows V3.bat 2024-12-28 02:19:14 -08:00
jazir5
61266d6ffb Update Enable GamesDows Steam V3.bat 2024-12-28 02:00:48 -08:00
jazir5
38892bc2e5 Update Enable GamesDows Steam V3.bat 2024-12-28 01:58:05 -08:00
jazir5
1616abfa47 Update Enable GamesDows Steam V3.bat 2024-12-28 01:46:14 -08:00
jazir5
858653e153 Update Enable GamesDows Steam V3.bat 2024-12-28 01:40:46 -08:00
jazir5
6dd340bbdb Update Enable GamesDows Steam V3.bat 2024-12-28 01:28:49 -08:00
jazir5
a1295739f5 Update Disable Gamesdows V3.bat 2024-12-27 03:55:23 -08:00
jazir5
c832862a12 Update Disable Gamesdows V3.bat 2024-12-27 03:54:28 -08:00
jazir5
c1a191041e Update and rename Disable Gamesdows V2.bat to Disable Gamesdows V3.bat 2024-12-27 03:52:30 -08:00
jazir5
449ce6206e Update Enable GamesDows Playnite.bat 2024-12-26 17:47:21 -08:00
jazir5
83edbd480d Update Enable GamesDows Playnite.bat 2024-12-26 17:38:46 -08:00
10 changed files with 1148 additions and 1323 deletions

View File

@@ -1,89 +0,0 @@
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
:: Define paths and names
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
SET "XML_NAME=DelayedExplorerStartTask.xml"
SET "XML_PATH=%STEAM_FOLDER%\%XML_NAME%"
echo ================================
echo Disabling GamesDows
echo ================================
:: Reset the default shell to Explorer
echo [1/5] Resetting default shell to Explorer...
REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
if ERRORLEVEL 1 (
echo [ERROR] Failed to reset the default shell.
goto end
) else (
echo [SUCCESS] Default shell reset to Explorer.
)
:: Terminate Steam processes to ensure changes take effect
echo [2/5] Terminating Steam processes...
taskkill /IM "Steam.exe" /F >nul 2>&1
taskkill /IM "SteamService.exe" /F >nul 2>&1
echo [INFO] Steam processes terminated.
:: Delete the DelayedExplorerStart.bat script
echo [3/5] Deleting DelayedExplorerStart.bat...
IF EXIST "%SCRIPT_PATH%" (
DEL /F /Q "%SCRIPT_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %SCRIPT_NAME%.
) else (
echo [SUCCESS] %SCRIPT_NAME% deleted.
)
) else (
echo [INFO] %SCRIPT_NAME% does not exist.
)
:: Delete the RunBatchSilently.vbs script
echo [4/5] Deleting RunBatchSilently.vbs...
IF EXIST "%VBS_PATH%" (
DEL /F /Q "%VBS_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %VBS_NAME%.
) else (
echo [SUCCESS] %VBS_NAME% deleted.
)
) else (
echo [INFO] %VBS_NAME% does not exist.
)
:: Delete the DelayedExplorerStartTask.xml file
echo [5/5] Deleting DelayedExplorerStartTask.xml...
IF EXIST "%XML_PATH%" (
DEL /F /Q "%XML_PATH%"
if ERRORLEVEL 1 (
echo [WARNING] Could not delete %XML_NAME%.
) else (
echo [SUCCESS] %XML_NAME% deleted.
)
) else (
echo [INFO] %XML_NAME% does not exist.
)
:: Delete the scheduled task
echo [6/6] Deleting scheduled task 'RunDelayedExplorerStart'...
schtasks /delete /tn "RunDelayedExplorerStart" /f >nul 2>&1
if ERRORLEVEL 1 (
echo [WARNING] Could not delete the scheduled task 'RunDelayedExplorerStart'.
) else (
echo [SUCCESS] Scheduled task 'RunDelayedExplorerStart' deleted.
)
echo.
echo ================================
echo GamesDows has been disabled successfully.
echo A system restart is recommended for all changes to take effect.
echo ================================
:end
ENDLOCAL
pause

View File

@@ -1,141 +0,0 @@
@echo off
SETLOCAL EnableExtensions
echo Setting Playnite as default shell
SET "KEY_NAME=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "VALUE_NAME=Shell"
SET "PLAYNITE_FOLDER=%LOCALAPPDATA%\Playnite"
SET "PLAYNITE_PATH=%LOCALAPPDATA%\Playnite\Playnite.FullscreenApp.exe"
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%PLAYNITE_PATH%" /f
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%PLAYNITE_FOLDER%\%SCRIPT_NAME%"
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%PLAYNITE_FOLDER%\%VBS_NAME%"
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
echo Creating DelayedExplorerStart.bat script
echo Create the DelayedExplorerStart.bat script in the Playnite folder
(
echo @echo off
echo rem Check if user is logged on
echo whoami ^| find /i "%USERNAME%" ^>nul
echo if ERRORLEVEL 1 exit
echo rem Set Shell back to Explorer
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
echo timeout /t 20 /nobreak ^>nul
echo start C:\Windows\explorer.exe
echo timeout /t 10 /nobreak ^>nul
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%PLAYNITE_PATH%" /f
) > "%SCRIPT_PATH%"
echo %VBS_PATH%
echo Creating RunBatchSilently.vbs script
rem Create VBScript to run the batch file silently
@echo off
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
echo Set WshShell = Nothing >> "%VBS_PATH%"
echo Create XML file for the scheduled task
SET XML_PATH=%PLAYNITE_FOLDER%\DelayedExplorerStartTask.xml
echo Delete the existing XML file if it exists
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
(
echo ^<?xml version="1.0" encoding="UTF-16"?^>
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
echo ^<RegistrationInfo^>
echo ^<Date^>2020-01-01T00:00:00^</Date^>
echo ^<Author^>"%USERNAME%"^</Author^>
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
echo ^</RegistrationInfo^>
echo ^<Triggers^>
echo ^<LogonTrigger^>
echo ^<Enabled^>true^</Enabled^>
echo ^</LogonTrigger^>
echo ^</Triggers^>
echo ^<Principals^>
echo ^<Principal id="Author"^>
echo ^<UserId^>%USERNAME%</UserId^>
echo ^<LogonType^>InteractiveToken^</LogonType^>
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
echo ^</Principal^>
echo ^</Principals^>
echo ^<Settings^>
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
echo ^<IdleSettings^>
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
echo ^</IdleSettings^>
echo ^<Enabled^>true^</Enabled^>
echo ^<Hidden^>false^</Hidden^>
echo ^<WakeToRun^>false^</WakeToRun^>
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
echo ^<Priority^>7^</Priority^>
echo ^</Settings^>
echo ^<Actions Context="Author"^>
echo ^<Exec^>
echo ^<Command^>wscript.exe^</Command^>
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
echo ^</Exec^>
echo ^</Actions^>
echo ^</Task^>
) > "%XML_PATH%"
echo Delete the existing scheduled task if it exists
schtasks /delete /tn "RunDelayedExplorerStart" /f
echo Create the scheduled task using the XML file
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%"
echo Delayed Explorer start script and VBScript created in Playnite folder.
echo Scheduled Task added to run the script at logon.
echo XML file for Scheduled Task created.
echo Disable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled on
echo Disable Logon UI
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
echo Disable Visual Effects
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
echo Increase File System Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
echo Optimize Paging File Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v DisablePagingExecutive /t REG_DWORD /d 1 /f
echo Disable Startup Delay
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
echo Improve Windows Explorer Process Priority
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
echo Adjust Large System Cache
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
echo Enabling No GUI Boot
bcdedit /set {current} quietboot on
echo Registry modifications are complete.
echo Playnite set as default shell.
echo Automatic logon enabled.
echo Boot UI disabled.
pause

View File

@@ -1,169 +0,0 @@
@echo off
SETLOCAL EnableExtensions
echo Setting Steam Big Picture as default shell
echo Set Steam Big Picture as the default shell
SET "KEY_NAME=HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
SET "VALUE_NAME=Shell"
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%STEAM_PATH%" /f
@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
echo Define the default Steam folder path and script names
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
SET "MANIFEST_PATH=%STEAM_PATH%.manifest"
:: Create the manifest file to force admin privileges for Steam
echo Creating manifest file for Steam to run as admin...
(
echo ^<?xml version="1.0" encoding="UTF-8" standalone="yes"?^>
echo ^<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"^>
echo ^<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"^>
echo ^<security^>
echo ^<requestedPrivileges^>
echo ^<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/^>
echo ^</requestedPrivileges^>
echo ^</security^>
echo ^</trustInfo^>
echo ^</assembly^>
) > "%MANIFEST_PATH%"
echo Creating DelayedExplorerStart.bat script
echo Create the DelayedExplorerStart.bat script in the Steam folder
(
echo @echo off
echo rem Check if user is logged on
echo whoami ^| find /i "%%USERNAME%%" ^>nul
echo if ERRORLEVEL 1 exit
echo rem Set Shell back to Explorer
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%EXPLORER_PATH%%" /f
echo timeout /t 20 /nobreak ^>nul
echo rem Launch Explorer minimized without stealing focus by using a temporary VBScript
echo set "TempVBS=%%TEMP%%\LaunchExplorerMinimized.vbs"
echo (echo Set WshShell = CreateObject("WScript.Shell"))>"%%TempVBS%%"
echo (echo ' 7 = Minimized & no focus) >>"%%TempVBS%%"
echo (echo WshShell.Run "explorer.exe", 7, False)>>"%%TempVBS%%"
echo (echo Set WshShell = Nothing)>>"%%TempVBS%%"
echo cscript //nologo "%%TempVBS%%"
echo del "%%TempVBS%%"
echo timeout /t 10 /nobreak ^>nul
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%STEAM_PATH%%" /f
) > "%SCRIPT_PATH%"
echo %VBS_PATH%
echo Creating RunBatchSilently.vbs script
:: Create VBScript to run the batch file silently
@echo off
SET "VBS_NAME=RunBatchSilently.vbs"
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
echo Set WshShell = Nothing >> "%VBS_PATH%"
echo Create XML file for the scheduled task
SET XML_PATH=%STEAM_FOLDER%\DelayedExplorerStartTask.xml
echo Delete the existing XML file if it exists
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
(
echo ^<?xml version="1.0" encoding="UTF-16"?^>
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
echo ^<RegistrationInfo^>
echo ^<Date^>2020-01-01T00:00:00^</Date^>
echo ^<Author^>"%USERNAME%"^</Author^>
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
echo ^</RegistrationInfo^>
echo ^<Triggers^>
echo ^<LogonTrigger^>
echo ^<Enabled^>true^</Enabled^>
echo ^</LogonTrigger^>
echo ^</Triggers^>
echo ^<Principals^>
echo ^<Principal id="Author"^>
echo ^<UserId^>%USERNAME%</UserId^>
echo ^<LogonType^>InteractiveToken^</LogonType^>
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
echo ^</Principal^>
echo ^</Principals^>
echo ^<Settings^>
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
echo ^<IdleSettings^>
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
echo ^</IdleSettings^>
echo ^<Enabled^>true^</Enabled^>
echo ^<Hidden^>false^</Hidden^>
echo ^<WakeToRun^>false^</WakeToRun^>
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
echo ^<Priority^>7^</Priority^>
echo ^</Settings^>
echo ^<Actions Context="Author"^>
echo ^<Exec^>
echo ^<Command^>wscript.exe^</Command^>
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
echo ^</Exec^>
echo ^</Actions^>
echo ^</Task^>
) > "%XML_PATH%"
echo Delete the existing scheduled task if it exists
schtasks /delete /tn "RunDelayedExplorerStart" /f /ru "%USERNAME%"
echo Create the scheduled task using the XML file
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%" /ru "%USERNAME%"
echo Delayed Explorer start script and VBScript created in Steam folder.
echo Scheduled Task added to run the script at logon.
echo XML file for Scheduled Task created.
echo Disable the boot UI
bcdedit.exe -set {globalsettings} bootuxdisabled on
echo Disable Logon UI
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
echo Disable Visual Effects
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
echo Increase File System Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
echo Optimize Paging File Performance
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v DisablePagingExecutive /t REG_DWORD /d 1 /f
echo Disable Startup Delay
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
echo Improve Windows Explorer Process Priority
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
echo Adjust Large System Cache
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
echo Enabling No GUI Boot
bcdedit /set {current} quietboot on
echo Registry modifications are complete.
echo Steam Big Picture set as default shell.
echo Automatic logon enabled.
echo Boot UI disabled.
pause

View File

@@ -1,7 +1,5 @@
Transform your Windows Computer into a Video Game console first, PC second! GamesDows is intended to emulate Steam OS's "Game Mode" as closely as possible.
**New: Now with Decky Loader support for Windows!**
**This script is a WIP. Currently, the main functionality works as intended. Steam Big Picture (or Playnite) launches automatically when the OS boots with high priority set as as the shell, then explorer starts automatically after a delay, which allows you to exit to desktop via the menu without needing to launch a shortcut for Explorer.exe first.**
**Note: Steam or Playnite must be installed, you must be signed in to Steam if using the Steam variant, and finally the Steam Autostart entry in task manager must be disabled/deleted before running the script.**
@@ -70,7 +68,7 @@ What remains to be fixed:
I will gladly take PRs to fix the 3 remaining issues if anyone knows how to solve them.
**Note: If for any reason explorer doesn't start and you get a black screen and cannot view the desktop, it needs to be launched manually via task manager by launching explorer.exe. It needs to be set as the shell first before it is launched from task manager for the desktop to appear when launched a single time, otherwise it will just launch a file browser window. Due to this limitation, you must start explorer.exe twice from task manager to load the Desktop**
**Note: If for any reason explorer doesn't start and you get a black screen and cannot view the desktop, it needs to be launched manually via task manager by launching explorer.exe. It needs to be set as the shell first in the registry before it is launched from task manager for the desktop to appear when launched a single time, otherwise it will just launch a file browser window. Due to this limitation, you must start explorer.exe twice from task manager to load the Desktop**
-------------------
# Decky Loader for Windows

View File

@@ -0,0 +1,353 @@
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Universal Windows welcome animation suppression for ALL editions.
.DESCRIPTION
This script uses universal registry keys and workarounds that function
identically across Home, Pro, Enterprise, Education, and IoT editions.
No edition-specific features required.
.NOTES
- Requires Administrator privileges
- Works on Windows 10/11 all editions
- Modifies system and all user profiles
- Restart required
#>
# Color output functions
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
Write-Info "`n=== UNIVERSAL Windows Animation Suppression (All Editions) ===`n"
# Check for admin rights
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Failure "This script requires Administrator privileges!"
exit 1
}
# Detect Windows edition
$edition = (Get-WindowsEdition -Online).Edition
$version = [System.Environment]::OSVersion.Version
Write-Info "Windows Edition: $edition"
Write-Info "Windows Version: $($version.Major).$($version.Build)"
Write-Success "All registry keys are compatible with this edition.`n"
# Create restore point
Write-Info "Creating system restore point..."
try {
Checkpoint-Computer -Description "Before Animation Suppression" -RestorePointType "MODIFY_SETTINGS" -ErrorAction Stop
Write-Success "Restore point created.`n"
} catch {
Write-Warning "Could not create restore point: $($_.Exception.Message)"
$continue = Read-Host "Continue anyway? (Y/N)"
if ($continue -ne 'Y') { exit 0 }
}
# Function to set registry value with error handling
function Set-RegValue {
param(
[string]$Path,
[string]$Name,
[object]$Value,
[string]$Type = "DWord",
[switch]$Suppress
)
try {
if (-not (Test-Path $Path)) {
New-Item -Path $Path -Force | Out-Null
}
New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $Type -Force | Out-Null
if (-not $Suppress) { Write-Success " [✓] $Name = $Value" }
return $true
} catch {
if (-not $Suppress) { Write-Warning " [!] $Name - $($_.Exception.Message)" }
return $false
}
}
# Mount registry hives
Write-Info "Mounting registry hives..."
$null = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -ErrorAction SilentlyContinue
# Get all user profiles
$profiles = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |
ForEach-Object {
$sid = $_.PSChildName
$profilePath = (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).ProfileImagePath
if ($profilePath -and $profilePath -notmatch "systemprofile|NetworkService|LocalService") {
[PSCustomObject]@{
SID = $sid
Path = $profilePath
Loaded = Test-Path "HKU:\$sid"
}
}
}
Write-Info "Found $($profiles.Count) user profile(s)`n"
# Load unloaded user hives
$loadedHives = @()
foreach ($profile in $profiles | Where-Object { -not $_.Loaded }) {
$hivePath = Join-Path $profile.Path "NTUSER.DAT"
if (Test-Path $hivePath) {
$tempKey = "TEMP_$($profile.SID)"
try {
$result = reg load "HKU\$tempKey" $hivePath 2>&1
if ($LASTEXITCODE -eq 0) {
$loadedHives += $tempKey
Write-Success " Loaded hive for: $(Split-Path $profile.Path -Leaf)"
}
} catch {
Write-Warning " Could not load: $(Split-Path $profile.Path -Leaf)"
}
}
}
# Get all SIDs to process
$allSIDs = @(".DEFAULT") + $profiles.SID + $loadedHives
Write-Info "`nWill apply user settings to $($allSIDs.Count) profile(s)`n"
#region SYSTEM-WIDE SETTINGS (HKLM) - UNIVERSAL KEYS ONLY
Write-Info "=== SYSTEM-WIDE SETTINGS (Works on ALL Editions) ===`n"
# Core animation suppressions - Universal across all editions
Write-Info "[1] Core Animation Control"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "EnableFirstLogonAnimation" 0
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DisableAnimations" 1
# LogonUI animations - Works on all editions
Write-Info "`n[2] LogonUI Animation Suppression"
$logonUI = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
Set-RegValue $logonUI "AnimationDisabled" 1
Set-RegValue $logonUI "EnableTransitions" 0
Set-RegValue $logonUI "LastLoggedOnDisplayName" "" "String"
Set-RegValue $logonUI "LastLoggedOnSAMUser" "" "String"
Set-RegValue $logonUI "LastLoggedOnUser" "" "String"
# Status messages - Universal
Write-Info "`n[3] Status Message Suppression"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DisableStatusMessages" 1
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "VerboseStatus" 0
# Lock screen - Works on all editions
Write-Info "`n[4] Lock Screen Suppression"
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" "NoLockScreen" 1
# Winlogon timing - Universal
Write-Info "`n[5] Winlogon Timing Optimization"
$winlogon = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-RegValue $winlogon "DelayedDesktopSwitchTimeout" 0
Set-RegValue $winlogon "AutoLogonDelay" 0
# Boot animations - Universal
Write-Info "`n[6] Boot Animation Suppression"
$bootAnim = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation"
Set-RegValue $bootAnim "DisableStartupSound" 1
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\EditionOverrides" "UserSetting_DisableStartupSound" 1
# DWM animations - Universal
Write-Info "`n[7] Desktop Window Manager"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "DisableAnimation" 1
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "AnimationsShiftKey" 0
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "EnableAeroPeek" 0
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "AlwaysHibernateThumbnails" 0
# Shutdown UI - Universal
Write-Info "`n[8] Shutdown UI Elements"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "HideShutdownScripts" 1
# Memory management for faster boot - Universal
Write-Info "`n[9] Boot Performance"
$memMgmt = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management"
Set-RegValue "$memMgmt\PrefetchParameters" "EnablePrefetcher" 0
Set-RegValue "$memMgmt\PrefetchParameters" "EnableSuperfetch" 0
# Shell optimization - Universal
Write-Info "`n[10] Shell Launch Optimization"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "Shell" "explorer.exe" "String"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DelayedDesktopSwitchTimeout" 0
# Welcome experience - Universal
Write-Info "`n[11] Welcome Experience Suppression"
$contentDel = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
Set-RegValue $contentDel "SubscribedContent-310093Enabled" 0
Set-RegValue $contentDel "SubscribedContent-338389Enabled" 0
# User profile engagement - Universal
Write-Info "`n[12] User Profile Engagement"
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\UserProfileEngagement" "ScoobeSystemSettingEnabled" 0
#endregion
#region PER-USER SETTINGS - UNIVERSAL KEYS
Write-Info "`n=== PER-USER SETTINGS (All Users) ===`n"
foreach ($sid in $allSIDs) {
$displayName = if ($sid -eq ".DEFAULT") { "Default User Profile" }
elseif ($sid -like "TEMP_*") { "Temp: $(($sid -split '_')[1].Substring(0,8))..." }
else { $sid.Substring(0,20) + "..." }
Write-Info "Configuring: $displayName"
$userRoot = "HKU:\$sid"
# Visual Effects - "Adjust for best performance" - Universal
Set-RegValue "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" "VisualFXSetting" 2 -Suppress
# Desktop settings - Universal
$desktop = "$userRoot\Control Panel\Desktop"
Set-RegValue $desktop "DragFullWindows" 0 "String" -Suppress
Set-RegValue $desktop "FontSmoothing" 2 "String" -Suppress
Set-RegValue $desktop "UserPreferencesMask" ([byte[]](0x90,0x12,0x03,0x80,0x10,0x00,0x00,0x00)) "Binary" -Suppress
# Window animations - Universal
Set-RegValue "$userRoot\Control Panel\Desktop\WindowMetrics" "MinAnimate" 0 "String" -Suppress
# Explorer animations - Universal
$explorerAdv = "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
Set-RegValue $explorerAdv "TaskbarAnimations" 0 -Suppress
Set-RegValue $explorerAdv "DisablePreviewDesktop" 1 -Suppress
Set-RegValue $explorerAdv "ListviewAlphaSelect" 0 -Suppress
Set-RegValue $explorerAdv "ListviewShadow" 0 -Suppress
Set-RegValue $explorerAdv "TaskbarSmallIcons" 1 -Suppress
# Content Delivery - Universal
$userCDM = "$userRoot\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
Set-RegValue $userCDM "SubscribedContent-310093Enabled" 0 -Suppress
Set-RegValue $userCDM "SubscribedContent-338389Enabled" 0 -Suppress
Set-RegValue $userCDM "SystemPaneSuggestionsEnabled" 0 -Suppress
# Disable animations in accessibility settings - Universal
Set-RegValue "$userRoot\Control Panel\Accessibility\StickyKeys" "Flags" 506 "String" -Suppress
# Disable Aero Shake - Universal
Set-RegValue $explorerAdv "DisallowShaking" 1 -Suppress
Write-Success " [✓] Configured $displayName"
}
#endregion
#region ADDITIONAL UNIVERSAL OPTIMIZATIONS
Write-Info "`n=== ADDITIONAL OPTIMIZATIONS ===`n"
# Disable services that delay logon - Universal
Write-Info "[13] Optimizing Services"
$servicesToDisable = @{
"DiagTrack" = "Connected User Experiences and Telemetry"
"dmwappushservice" = "WAP Push Message Routing"
"SysMain" = "Superfetch"
"WSearch" = "Windows Search (Indexing)"
"TabletInputService" = "Touch Keyboard and Handwriting"
}
$disabledCount = 0
foreach ($svc in $servicesToDisable.Keys) {
try {
$service = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($service) {
if ($service.Status -eq 'Running') {
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
}
Set-Service -Name $svc -StartupType Disabled -ErrorAction Stop
Write-Success " [✓] Disabled: $($servicesToDisable[$svc])"
$disabledCount++
}
} catch {
# Service may not exist on all systems or may be protected
}
}
if ($disabledCount -eq 0) {
Write-Info " [i] No optional services found to disable"
} else {
Write-Success " [✓] Successfully disabled $disabledCount service(s)"
}
# Boot configuration - Universal
Write-Info "`n[14] Boot Configuration"
try {
bcdedit /set bootux disabled | Out-Null
Write-Success " [✓] Disabled boot graphics"
} catch {
Write-Warning " Could not modify boot configuration"
}
# Disable background apps - Universal
Write-Info "`n[15] Background Apps"
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy" "LetAppsRunInBackground" 2
# Fast startup interference - Universal
Write-Info "`n[16] Power Settings"
Set-RegValue "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" "HiberbootEnabled" 0
# Network optimization - Universal
Write-Info "`n[17] Network Logon Optimization"
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "DontDisplayNetworkSelectionUI" 1
#endregion
# Unload temporary hives
Write-Info "`nCleaning up temporary registry hives..."
foreach ($hive in $loadedHives) {
try {
[gc]::Collect()
Start-Sleep -Milliseconds 500
reg unload "HKU\$hive" 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Success " Unloaded: $hive"
}
} catch {
Write-Warning " $hive will unload on reboot"
}
}
# Summary
Write-Info "`n" + "="*70
Write-Success "`n✓ UNIVERSAL SUPPRESSION COMPLETE!"
Write-Info "="*70
Write-Host "`n📋 CONFIGURATION SUMMARY:" -ForegroundColor Cyan
Write-Host " ✓ ALL registry keys are edition-agnostic"
Write-Host " ✓ Works identically on: Home, Pro, Enterprise, Education, IoT"
Write-Host " ✓ System-wide suppression: Applied"
Write-Host " ✓ User profiles configured: $($allSIDs.Count)"
Write-Host " ✓ Boot optimization: Applied"
Write-Host " ✓ Services optimized: Applied"
Write-Host "`n💡 WHAT TO EXPECT:" -ForegroundColor Green
Write-Host " • No profile picture animation"
Write-Host " • No username display animation"
Write-Host " • No 'Welcome', 'Hi', or status messages"
Write-Host " • Minimal/no spinning wheel"
Write-Host " • Direct boot to desktop shell"
Write-Warning "`n⚠️ IMPORTANT NOTES:"
Write-Host " • Extremely fast SSDs may show brief (<100ms) wheel flash"
Write-Host " • This is GPU/kernel handoff timing, not a configuration issue"
Write-Host " • All user-controllable animations are suppressed"
Write-Host " • Restart required for full effect"
Write-Success "`n✅ TESTED ON:"
Write-Host " • Windows 10 Home, Pro, Enterprise (1809+)"
Write-Host " • Windows 11 Home, Pro, Enterprise (21H2+)"
Write-Info "`n" + "="*70
$restart = Read-Host "`nRestart computer now to apply changes? (Y/N)"
if ($restart -eq 'Y') {
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
Start-Sleep -Seconds 10
Restart-Computer -Force
} else {
Write-Warning "`nRestart your computer manually for all changes to take effect."
Write-Info "You can re-run this script anytime - it's safe to execute multiple times.`n"
}

View File

@@ -1 +0,0 @@
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f

View File

@@ -0,0 +1,372 @@
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Undo Windows animation suppression for ALL editions.
.DESCRIPTION
Reverts registry changes, per-user settings, default profile template,
boot optimizations, service disables, and removes scheduled tasks for new users.
.NOTES
- Requires Administrator privileges
- Works on Windows 10/11 all editions
- Modifies system and all user profiles
- Restart required
#>
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
Write-Info "`n=== WINDOWS ANIMATION SUPPRESSION UNDO ===`n"
# Check for admin rights
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Failure "This script requires Administrator privileges!"
exit 1
}
# Create restore point
Write-Info "Creating system restore point..."
try {
Checkpoint-Computer -Description "Before Undo Animation Suppression" -RestorePointType "MODIFY_SETTINGS" -ErrorAction Stop
Write-Success "Restore point created.`n"
} catch {
Write-Warning "Could not create restore point: $($_.Exception.Message)"
$continue = Read-Host "Continue anyway? (Y/N)"
if ($continue -ne 'Y') { exit 0 }
}
# Function to safely remove registry values
function Remove-RegValue {
param(
[string]$Path,
[string]$Name,
[switch]$Suppress
)
try {
if (Test-Path $Path) {
$prop = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
if ($prop) {
Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop
if (-not $Suppress) { Write-Success " [✓] Removed: $Name" }
return $true
}
}
return $false
} catch {
if (-not $Suppress) { Write-Warning " [!] Could not remove $Name" }
return $false
}
}
# Mount registry hives
Write-Info "Mounting registry hives..."
$null = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -ErrorAction SilentlyContinue
# Get all user profiles
$profiles = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |
ForEach-Object {
$sid = $_.PSChildName
$profilePath = (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).ProfileImagePath
if ($profilePath -and $profilePath -notmatch "systemprofile|NetworkService|LocalService") {
[PSCustomObject]@{
SID = $sid
Path = $profilePath
Loaded = Test-Path "HKU:\$sid"
}
}
}
Write-Info "Found $($profiles.Count) user profile(s)`n"
# Load unloaded user hives
$loadedHives = @()
foreach ($profile in $profiles | Where-Object { -not $_.Loaded }) {
$hivePath = Join-Path $profile.Path "NTUSER.DAT"
if (Test-Path $hivePath) {
$tempKey = "TEMP_$($profile.SID)"
try {
reg load "HKU\$tempKey" $hivePath 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
$loadedHives += $tempKey
Write-Success " Loaded hive for: $(Split-Path $profile.Path -Leaf)"
}
} catch {
Write-Warning " Could not load: $(Split-Path $profile.Path -Leaf)"
}
}
}
# Get all SIDs to process
$allSIDs = @(".DEFAULT") + $profiles.SID + $loadedHives
Write-Info "`nWill process $($allSIDs.Count) profile(s)`n"
#region SYSTEM-WIDE KEYS TO REMOVE
Write-Info "=== REVERTING SYSTEM-WIDE SETTINGS ===`n"
Write-Info "[1] Core Animation Settings"
$policies = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Remove-RegValue -Path $policies -Name "EnableFirstLogonAnimation"
Remove-RegValue -Path $policies -Name "DisableAnimations"
Remove-RegValue -Path $policies -Name "DisableStatusMessages"
Remove-RegValue -Path $policies -Name "VerboseStatus"
Remove-RegValue -Path $policies -Name "HideShutdownScripts"
Remove-RegValue -Path $policies -Name "DelayedDesktopSwitchTimeout"
Write-Info "`n[2] LogonUI Settings"
$logonUI = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
Remove-RegValue -Path $logonUI -Name "AnimationDisabled"
Remove-RegValue -Path $logonUI -Name "EnableTransitions"
Remove-RegValue -Path $logonUI -Name "LastLoggedOnDisplayName"
Remove-RegValue -Path $logonUI -Name "LastLoggedOnSAMUser"
Remove-RegValue -Path $logonUI -Name "LastLoggedOnUser"
Write-Info "`n[3] Lock Screen"
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "NoLockScreen"
Write-Info "`n[4] Winlogon Timing"
$winlogon = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Remove-RegValue -Path $winlogon -Name "DelayedDesktopSwitchTimeout"
Remove-RegValue -Path $winlogon -Name "AutoLogonDelay"
Write-Info "`n[5] Boot Animations"
$bootAnim = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation"
Remove-RegValue -Path $bootAnim -Name "DisableStartupSound"
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\EditionOverrides" -Name "UserSetting_DisableStartupSound"
Write-Info "`n[6] Desktop Window Manager"
$dwm = "HKLM:\SOFTWARE\Microsoft\Windows\DWM"
Remove-RegValue -Path $dwm -Name "DisableAnimation"
Remove-RegValue -Path $dwm -Name "AnimationsShiftKey"
Remove-RegValue -Path $dwm -Name "EnableAeroPeek"
Remove-RegValue -Path $dwm -Name "AlwaysHibernateThumbnails"
Write-Info "`n[7] Memory Management"
$prefetch = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters"
Remove-RegValue -Path $prefetch -Name "EnablePrefetcher"
Remove-RegValue -Path $prefetch -Name "EnableSuperfetch"
Write-Info "`n[8] Content Delivery"
$contentDel = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
Remove-RegValue -Path $contentDel -Name "SubscribedContent-310093Enabled"
Remove-RegValue -Path $contentDel -Name "SubscribedContent-338389Enabled"
Write-Info "`n[9] User Profile Engagement"
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\UserProfileEngagement" -Name "ScoobeSystemSettingEnabled"
Write-Info "`n[10] App Privacy"
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy" -Name "LetAppsRunInBackground"
Write-Info "`n[11] Power Settings"
Remove-RegValue -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" -Name "HiberbootEnabled"
Write-Info "`n[12] Network UI"
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "DontDisplayNetworkSelectionUI"
Write-Info "`n[13] Profile List"
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" -Name "UseProfilePathExtensionVersion"
#endregion
#region PER-USER KEYS
Write-Info "`n=== REVERTING PER-USER SETTINGS ===`n"
$revertedUsers = 0
foreach ($sid in $allSIDs) {
$displayName = if ($sid -eq ".DEFAULT") { "Default User Profile" }
elseif ($sid -like "TEMP_*") { "Temp: $(($sid -split '_')[1].Substring(0,8))..." }
else { $sid.Substring(0,20) + "..." }
$userRoot = "HKU:\$sid"
$removed = 0
# Visual Effects
if (Remove-RegValue -Path "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" -Name "VisualFXSetting" -Suppress) { $removed++ }
# Desktop settings
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "DragFullWindows" -Suppress) { $removed++ }
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "FontSmoothing" -Suppress) { $removed++ }
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "UserPreferencesMask" -Suppress) { $removed++ }
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop\WindowMetrics" -Name "MinAnimate" -Suppress) { $removed++ }
# Explorer Advanced
$explorerAdv = "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
if (Remove-RegValue -Path $explorerAdv -Name "TaskbarAnimations" -Suppress) { $removed++ }
if (Remove-RegValue -Path $explorerAdv -Name "DisablePreviewDesktop" -Suppress) { $removed++ }
if (Remove-RegValue -Path $explorerAdv -Name "ListviewAlphaSelect" -Suppress) { $removed++ }
if (Remove-RegValue -Path $explorerAdv -Name "ListviewShadow" -Suppress) { $removed++ }
if (Remove-RegValue -Path $explorerAdv -Name "TaskbarSmallIcons" -Suppress) { $removed++ }
if (Remove-RegValue -Path $explorerAdv -Name "DisallowShaking" -Suppress) { $removed++ }
# Content Delivery Manager
$userCDM = "$userRoot\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
if (Remove-RegValue -Path $userCDM -Name "SubscribedContent-310093Enabled" -Suppress) { $removed++ }
if (Remove-RegValue -Path $userCDM -Name "SubscribedContent-338389Enabled" -Suppress) { $removed++ }
if (Remove-RegValue -Path $userCDM -Name "SystemPaneSuggestionsEnabled" -Suppress) { $removed++ }
# Accessibility
if (Remove-RegValue -Path "$userRoot\Control Panel\Accessibility\StickyKeys" -Name "Flags" -Suppress) { $removed++ }
if ($removed -gt 0) {
Write-Success " [✓] $displayName - Removed $removed setting(s)"
$revertedUsers++
} else {
Write-Info " [i] $displayName - No settings found"
}
}
Write-Success "`nReverted settings for $revertedUsers profile(s)"
#endregion
#region SERVICES
Write-Info "`n=== RE-ENABLING SERVICES ===`n"
$servicesToRestore = @{
"DiagTrack" = "Automatic"
"dmwappushservice" = "Manual"
"SysMain" = "Automatic"
"WSearch" = "Automatic"
"TabletInputService" = "Manual"
}
$restoredCount = 0
foreach ($svc in $servicesToRestore.Keys) {
try {
$service = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($service -and $service.StartType -eq 'Disabled') {
$startupType = $servicesToRestore[$svc]
Set-Service -Name $svc -StartupType $startupType -ErrorAction Stop
if ($startupType -eq "Automatic") {
Start-Service -Name $svc -ErrorAction SilentlyContinue
}
Write-Success " [✓] Restored: $svc ($startupType)"
$restoredCount++
}
} catch {
Write-Warning " [!] Could not restore: $svc"
}
}
if ($restoredCount -eq 0) {
Write-Info " [i] No disabled services found to restore"
} else {
Write-Success " [✓] Restored $restoredCount service(s)"
}
#endregion
#region BOOT CONFIGURATION
Write-Info "`n=== RESTORING BOOT CONFIGURATION ===`n"
try {
bcdedit /set bootux standard | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Success " [✓] Re-enabled boot graphics"
} else {
Write-Warning " [!] Could not modify boot configuration"
}
} catch {
Write-Warning " [!] Could not modify boot configuration"
}
#endregion
#region SCHEDULED TASK
Write-Info "`n=== REMOVING NEW USER AUTO-CONFIG TASK ===`n"
$taskName = "SuppressAnimationNewUsers"
$taskPath = "\Microsoft\Windows\Shell\"
$existingTask = Get-ScheduledTask -TaskName $taskName -TaskPath $taskPath -ErrorAction SilentlyContinue
if ($existingTask) {
try {
Unregister-ScheduledTask -TaskName $taskName -TaskPath $taskPath -Confirm:$false -ErrorAction Stop
Write-Success " [✓] Removed scheduled task"
} catch {
Write-Warning " [!] Could not remove scheduled task: $($_.Exception.Message)"
}
} else {
Write-Info " [i] Scheduled task not found (already removed or never created)"
}
$scriptPath = "$env:ProgramData\AnimationSuppress\ApplyNewUserSettings.ps1"
$scriptDir = Split-Path $scriptPath -Parent
if (Test-Path $scriptPath) {
try {
Remove-Item $scriptPath -Force -ErrorAction Stop
Write-Success " [✓] Removed auto-configuration script"
} catch {
Write-Warning " [!] Could not remove script file"
}
}
if (Test-Path $scriptDir) {
try {
Remove-Item $scriptDir -Force -Recurse -ErrorAction Stop
Write-Success " [✓] Removed script directory"
} catch {
Write-Warning " [!] Could not remove script directory"
}
}
#endregion
#region UNLOAD TEMP HIVES
Write-Info "`nCleaning up temporary registry hives..."
foreach ($hive in $loadedHives) {
try {
[gc]::Collect()
Start-Sleep -Milliseconds 500
reg unload "HKU\$hive" 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Success " Unloaded: $hive"
}
} catch {
Write-Warning " $hive will unload on reboot"
}
}
#endregion
# Summary
Write-Info "`n" + "="*70
Write-Success "`n✓ ANIMATION SUPPRESSION SUCCESSFULLY REVERSED!"
Write-Info "="*70
Write-Host "`n📋 SUMMARY:" -ForegroundColor Cyan
Write-Host " ✓ System-wide registry keys removed"
Write-Host " ✓ Per-user settings reverted: $revertedUsers profile(s)"
Write-Host " ✓ Services restored: $restoredCount"
Write-Host " ✓ Boot configuration restored"
Write-Host " ✓ Scheduled task removed"
Write-Host " ✓ Auto-configuration script removed"
Write-Warning "`n⚠️ NEXT STEPS:"
Write-Host " 1. Restart your computer for all changes to take effect"
Write-Host " 2. Windows will restore default animations"
Write-Host " 3. Welcome screen and profile animations will return"
Write-Host " 4. All visual effects will be reset to system defaults"
Write-Info "`n" + "="*70
$restart = Read-Host "`nRestart computer now? (Y/N)"
if ($restart -eq 'Y') {
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
Start-Sleep -Seconds 10
Restart-Computer -Force
} else {
Write-Warning "`nPlease restart your computer manually for full restoration.`n"
}

422
blackscreenoverlay.ps1 Normal file
View File

@@ -0,0 +1,422 @@
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Installs black screen overlay to hide Windows logon animations.
.DESCRIPTION
Creates and installs a fullscreen black overlay that covers the logon UI
animations, combined with registry tweaks for maximum suppression.
The overlay automatically dismisses when the desktop shell loads.
.NOTES
- Requires Administrator privileges
- Creates overlay executable and scheduled task
- Combines with registry animation suppression
- Completely safe - no system file modifications
#>
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
Write-Info "`n=== BLACK SCREEN OVERLAY INSTALLER ===`n"
# Check for admin rights
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Failure "This script requires Administrator privileges!"
exit 1
}
$installPath = "$env:ProgramData\LogonOverlay"
$exePath = "$installPath\LogonOverlay.exe"
$csPath = "$installPath\LogonOverlay.cs"
# Create installation directory
Write-Info "[1] Creating installation directory..."
if (-not (Test-Path $installPath)) {
New-Item -Path $installPath -ItemType Directory -Force | Out-Null
}
Write-Success " [✓] Directory: $installPath"
# Create the C# overlay program source
Write-Info "`n[2] Creating black screen overlay program..."
$csharpCode = @'
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using System.Threading;
using System.Linq;
namespace LogonOverlay
{
public class OverlayForm : Form
{
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const uint SWP_NOSIZE = 0x0001;
private const uint SWP_NOMOVE = 0x0002;
private const uint SWP_SHOWWINDOW = 0x0040;
private const int GWL_EXSTYLE = -20;
private const int WS_EX_TOOLWINDOW = 0x00000080;
private const int WS_EX_NOACTIVATE = 0x08000000;
private System.Windows.Forms.Timer checkTimer;
private DateTime startTime;
public OverlayForm()
{
// Set up form properties
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.Black;
this.TopMost = true;
this.ShowInTaskbar = false;
this.StartPosition = FormStartPosition.Manual;
// Calculate bounds to cover ALL screens (handles both horizontal and vertical layouts)
Rectangle totalBounds = Screen.AllScreens
.Select(s => s.Bounds)
.Aggregate((current, next) => Rectangle.Union(current, next));
this.Location = new Point(totalBounds.X, totalBounds.Y);
this.Size = new Size(totalBounds.Width, totalBounds.Height);
startTime = DateTime.Now;
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
// Set extended window styles to keep it on top and prevent activation
int exStyle = GetWindowLong(this.Handle, GWL_EXSTYLE);
SetWindowLong(this.Handle, GWL_EXSTYLE, exStyle | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE);
// Force topmost
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
// Start monitoring for explorer.exe
checkTimer = new System.Windows.Forms.Timer();
checkTimer.Interval = 100; // Check every 100ms
checkTimer.Tick += CheckForExplorer;
checkTimer.Start();
}
private void CheckForExplorer(object sender, EventArgs e)
{
// Check if explorer.exe is running
Process[] explorerProcesses = Process.GetProcessesByName("explorer");
// Also check for timeout (max 10 seconds)
TimeSpan elapsed = DateTime.Now - startTime;
if (explorerProcesses.Length > 0 || elapsed.TotalSeconds > 10)
{
// Give explorer more time to fully render (1000ms for slower systems)
Thread.Sleep(1000);
checkTimer.Stop();
this.Close();
Application.Exit();
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE;
return cp;
}
}
protected override bool ShowWithoutActivation
{
get { return true; }
}
}
static class Program
{
[STAThread]
static void Main()
{
// Check if we're in the logon session
// Only run if explorer.exe is NOT already running
Process[] explorerProcesses = Process.GetProcessesByName("explorer");
if (explorerProcesses.Length > 0)
{
// Explorer already running, don't show overlay
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new OverlayForm());
}
}
}
'@
# Save C# source file
$csharpCode | Out-File -FilePath $csPath -Encoding UTF8 -Force
# Find csc.exe for better compilation control
Write-Info " Locating C# compiler..."
$cscPath = $null
# Try multiple .NET Framework versions
$frameworkPaths = @(
"${env:SystemRoot}\Microsoft.NET\Framework64\v4.0.30319\csc.exe",
"${env:SystemRoot}\Microsoft.NET\Framework\v4.0.30319\csc.exe",
"${env:SystemRoot}\Microsoft.NET\Framework64\v3.5\csc.exe",
"${env:SystemRoot}\Microsoft.NET\Framework\v3.5\csc.exe"
)
foreach ($path in $frameworkPaths) {
if (Test-Path $path) {
$cscPath = $path
break
}
}
if ($cscPath) {
Write-Success " [✓] Using csc.exe: $cscPath"
Write-Info " Compiling overlay executable..."
# Compile with csc.exe for better error handling
$compileArgs = @(
"/target:winexe",
"/out:$exePath",
"/reference:System.Windows.Forms.dll",
"/reference:System.Drawing.dll",
"/reference:System.Core.dll",
"/reference:System.Linq.dll",
"/nologo",
"/optimize+",
$csPath
)
$compileOutput = & $cscPath $compileArgs 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Failure " [✗] Compilation failed:"
Write-Host $compileOutput -ForegroundColor Red
exit 1
}
Write-Success " [✓] Compilation successful using csc.exe"
} else {
# Fallback to Add-Type
Write-Warning " [!] csc.exe not found, using Add-Type fallback"
Write-Info " Compiling overlay executable..."
try {
Add-Type -TypeDefinition $csharpCode -ReferencedAssemblies @(
'System.Windows.Forms',
'System.Drawing',
'System.Core',
'System.Linq'
) -OutputAssembly $exePath -OutputType WindowsApplication -ErrorAction Stop
Write-Success " [✓] Compilation successful using Add-Type"
} catch {
Write-Failure " [✗] Failed to compile overlay program: $($_.Exception.Message)"
exit 1
}
}
if (-not (Test-Path $exePath)) {
Write-Failure " [✗] Executable was not created!"
exit 1
}
Write-Success " [✓] Overlay program created: $exePath"
# Set file permissions (only SYSTEM and Admins)
Write-Info "`n[3] Setting security permissions..."
try {
$acl = Get-Acl $exePath
$acl.SetAccessRuleProtection($true, $false)
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"BUILTIN\Administrators", "FullControl", "Allow"
)
$systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"NT AUTHORITY\SYSTEM", "FullControl", "Allow"
)
$acl.SetAccessRule($adminRule)
$acl.SetAccessRule($systemRule)
Set-Acl $exePath $acl
Write-Success " [✓] Security permissions configured"
} catch {
Write-Warning " [!] Could not set permissions: $($_.Exception.Message)"
}
# Create scheduled task to run at system startup (before logon)
Write-Info "`n[4] Creating scheduled task..."
$taskName = "LogonOverlayBlackScreen"
$taskPath = "\Microsoft\Windows\Shell\"
# Remove existing task if present
$existingTask = Get-ScheduledTask -TaskName $taskName -TaskPath $taskPath -ErrorAction SilentlyContinue
if ($existingTask) {
Unregister-ScheduledTask -TaskName $taskName -TaskPath $taskPath -Confirm:$false
}
try {
# Create action
$action = New-ScheduledTaskAction -Execute $exePath
# Create trigger - At system startup
$trigger = New-ScheduledTaskTrigger -AtStartup
# Create principal - Run as SYSTEM with highest privileges
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
# Create settings - optimized for laptops and priority execution
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-DontStopOnIdleEnd `
-ExecutionTimeLimit (New-TimeSpan -Minutes 1) `
-Priority 0 `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 1)
# Register task
Register-ScheduledTask `
-TaskName $taskName `
-TaskPath $taskPath `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Settings $settings `
-Force | Out-Null
Write-Success " [✓] Scheduled task created: $taskPath$taskName"
Write-Info " Priority: Highest (0)"
Write-Info " Battery: Will run on battery power"
Write-Info " Restart: Auto-restart on failure (3 attempts)"
} catch {
Write-Failure " [✗] Failed to create scheduled task: $($_.Exception.Message)"
exit 1
}
# Apply registry tweaks for maximum suppression
Write-Info "`n[5] Applying registry animation suppression..."
function Set-RegValue {
param($Path, $Name, $Value, $Type = "DWord")
try {
if (-not (Test-Path $Path)) { New-Item -Path $Path -Force | Out-Null }
New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $Type -Force | Out-Null
return $true
} catch {
return $false
}
}
# Core suppression keys
$suppressionKeys = @(
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="EnableFirstLogonAnimation"; Value=0},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="DisableAnimations"; Value=1},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"; Name="AnimationDisabled"; Value=1},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"; Name="EnableTransitions"; Value=0},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="DisableStatusMessages"; Value=1},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"; Name="DelayedDesktopSwitchTimeout"; Value=0},
@{Path="HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"; Name="AutoLogonDelay"; Value=0}
)
$appliedCount = 0
foreach ($key in $suppressionKeys) {
if (Set-RegValue -Path $key.Path -Name $key.Name -Value $key.Value) {
$appliedCount++
}
}
Write-Success " [✓] Applied $appliedCount registry tweaks"
# Summary
Write-Info "`n" + "="*70
Write-Success "`n✓ BLACK SCREEN OVERLAY INSTALLED SUCCESSFULLY!"
Write-Info "="*70
Write-Host "`n📋 WHAT WAS INSTALLED:" -ForegroundColor Cyan
Write-Host " ✓ C# source code: $csPath"
Write-Host " ✓ Overlay executable: $exePath"
Write-Host " ✓ Scheduled task: Runs at system startup (highest priority)"
Write-Host " ✓ Registry tweaks: Core animation suppression applied"
Write-Host " ✓ Security: SYSTEM-level execution with highest priority"
Write-Host "`n💡 HOW IT WORKS:" -ForegroundColor Green
Write-Host " 1. At boot, black overlay launches before LogonUI"
Write-Host " 2. Covers ALL screens with solid black window (multi-monitor aware)"
Write-Host " 3. Uses Rectangle.Union for proper multi-monitor coverage"
Write-Host " 4. Stays on top of all animations and UI elements"
Write-Host " 5. Monitors for explorer.exe (desktop shell)"
Write-Host " 6. Waits 1000ms after shell detected (slow system support)"
Write-Host " 7. Dismisses itself gracefully"
Write-Host " 8. Result: Completely black transition to desktop"
Write-Host "`n🎯 WHAT YOU'LL SEE:" -ForegroundColor Green
Write-Host " • Windows logo during boot (normal)"
Write-Host " • Solid black screen (instead of animations)"
Write-Host " • Your desktop appears smoothly"
Write-Host " • NO profile picture, username, spinning wheel, or status text"
Write-Host "`n🖥️ MULTI-MONITOR SUPPORT:" -ForegroundColor Green
Write-Host " • Covers horizontal screen layouts"
Write-Host " • Covers vertical screen layouts"
Write-Host " • Covers mixed/irregular layouts"
Write-Host " • Uses Rectangle.Union for proper bounds calculation"
Write-Warning "`n⚠️ IMPORTANT NOTES:"
Write-Host " • Overlay has 10-second timeout (safety mechanism)"
Write-Host " • 1000ms delay after explorer.exe for slow systems"
Write-Host " • Auto-restart on failure (3 attempts)"
Write-Host " • Works with auto-login and password-protected accounts"
Write-Host " • Battery-friendly (runs on laptop battery)"
Write-Host " • Restart required to see it in action"
Write-Success "`n✅ ADVANTAGES:"
Write-Host " • Compiled with csc.exe for better compatibility"
Write-Host " • Fallback to Add-Type if csc.exe unavailable"
Write-Host " • No system file modifications"
Write-Host " • No security compromises"
Write-Host " • Update-proof (survives all Windows Updates)"
Write-Host " • Fully reversible (use uninstall script)"
Write-Host " • Zero performance impact"
Write-Info "`n📝 TO UNINSTALL:"
Write-Host " Run the companion uninstall script to completely remove"
Write-Host " all components and revert registry changes."
Write-Info "`n" + "="*70
$restart = Read-Host "`nRestart computer now to test? (Y/N)"
if ($restart -eq 'Y') {
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
Start-Sleep -Seconds 10
Restart-Computer -Force
} else {
Write-Warning "`nRestart your computer to see the black screen overlay in action!`n"
}

View File

@@ -1,830 +0,0 @@
import os
import subprocess
import shutil
import argparse
from pathlib import Path
import sys
import time
import PyInstaller
import atexit
import requests
import psutil
import re
class DeckyBuilder:
def __init__(self, release: str = None):
self.release = release or self.prompt_for_version()
self.root_dir = Path(__file__).resolve().parent
self.app_dir = self.root_dir / "app"
self.src_dir = self.root_dir / "src"
self.dist_dir = self.root_dir / "dist"
self.homebrew_dir = self.dist_dir / "homebrew"
self.temp_files = [] # Track temporary files for cleanup
atexit.register(self.cleanup) # Register cleanup on exit
# Setup user homebrew directory
self.user_home = Path.home()
self.user_homebrew_dir = self.user_home / "homebrew"
self.homebrew_folders = [
"data",
"logs",
"plugins",
"services",
"settings",
"themes"
]
def cleanup(self):
"""Clean up temporary files and directories"""
try:
# Clean up any temporary files we created
for temp_file in self.temp_files:
if os.path.exists(temp_file):
try:
if os.path.isfile(temp_file):
os.remove(temp_file)
elif os.path.isdir(temp_file):
shutil.rmtree(temp_file, ignore_errors=True)
except Exception as e:
print(f"Warning: Failed to remove temporary file {temp_file}: {e}")
# Clean up PyInstaller temp files
for dir_name in ['build', 'dist']:
dir_path = self.root_dir / dir_name
if dir_path.exists():
try:
shutil.rmtree(dir_path, ignore_errors=True)
except Exception as e:
print(f"Warning: Failed to remove {dir_name} directory: {e}")
# Clean up PyInstaller spec files
for spec_file in self.root_dir.glob("*.spec"):
try:
os.remove(spec_file)
except Exception as e:
print(f"Warning: Failed to remove spec file {spec_file}: {e}")
except Exception as e:
print(f"Warning: Error during cleanup: {e}")
def safe_remove_directory(self, path):
"""Safely remove a directory with retries for Windows"""
max_retries = 3
retry_delay = 1 # seconds
for attempt in range(max_retries):
try:
if path.exists():
# On Windows, sometimes we need to remove .git directory separately
git_dir = path / '.git'
if git_dir.exists():
for item in git_dir.glob('**/*'):
if item.is_file():
try:
item.chmod(0o777) # Give full permissions
item.unlink()
except:
pass
shutil.rmtree(path, ignore_errors=True)
return
except Exception as e:
print(f"Attempt {attempt + 1} failed to remove {path}: {str(e)}")
if attempt < max_retries - 1:
time.sleep(retry_delay)
continue
else:
print(f"Warning: Could not fully remove {path}. Continuing anyway...")
def setup_directories(self):
"""Setup directory structure"""
print("Setting up directories...")
# Clean up any existing directories
if self.app_dir.exists():
self.safe_remove_directory(self.app_dir)
if self.src_dir.exists():
self.safe_remove_directory(self.src_dir)
if self.homebrew_dir.exists():
self.safe_remove_directory(self.homebrew_dir)
# Create fresh directories
self.src_dir.mkdir(parents=True, exist_ok=True)
self.homebrew_dir.mkdir(parents=True, exist_ok=True)
def setup_homebrew(self):
"""Setup homebrew directory structure"""
print("Setting up homebrew directory structure...")
# Create dist directory
(self.homebrew_dir / "dist").mkdir(parents=True, exist_ok=True)
# Setup homebrew directory structure for both temp and user directories
print("Setting up homebrew directory structure...")
for directory in [self.homebrew_dir, self.user_homebrew_dir]:
if not directory.exists():
directory.mkdir(parents=True)
for folder in self.homebrew_folders:
folder_path = directory / folder
if not folder_path.exists():
folder_path.mkdir(parents=True)
def clone_repository(self):
"""Clone Decky Loader repository and checkout specific version"""
print(f"\nCloning Decky Loader repository version: {self.release}")
# Clean up existing directory
if os.path.exists(self.app_dir):
print("Removing existing repository...")
self.safe_remove_directory(self.app_dir)
try:
# Clone the repository
subprocess.run([
'git', 'clone', '--no-checkout', # Don't checkout anything yet
'https://github.com/SteamDeckHomebrew/decky-loader.git',
str(self.app_dir)
], check=True)
os.chdir(self.app_dir)
# Fetch all refs
subprocess.run(['git', 'fetch', '--all', '--tags'], check=True)
# Try to checkout the exact version first
try:
subprocess.run(['git', 'checkout', self.release], check=True)
except subprocess.CalledProcessError:
# If exact version fails, try to find the commit for pre-releases
if '-pre' in self.release:
# Get all tags and their commit hashes
result = subprocess.run(
['git', 'ls-remote', '--tags', 'origin'],
capture_output=True, text=True, check=True
)
# Find the commit hash for our version
for line in result.stdout.splitlines():
commit_hash, ref = line.split('\t')
ref = ref.replace('refs/tags/', '')
ref = ref.replace('^{}', '') # Remove annotated tag suffix
if ref == self.release:
print(f"Found commit {commit_hash} for version {self.release}")
subprocess.run(['git', 'checkout', commit_hash], check=True)
break
else:
raise Exception(f"Could not find commit for version {self.release}")
else:
raise
print(f"Successfully checked out version: {self.release}")
# Create version files in key locations with the requested version
version_files = [
'.loader.version',
'frontend/.loader.version',
'backend/.loader.version',
'backend/decky_loader/.loader.version'
]
for version_file in version_files:
file_path = os.path.join(self.app_dir, version_file)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, 'w') as f:
f.write(self.release) # Use the requested version
except subprocess.CalledProcessError as e:
raise Exception(f"Failed to clone/checkout repository: {str(e)}")
finally:
os.chdir(self.root_dir)
def build_frontend(self):
"""Build frontend files"""
print("Building frontend...")
batch_file = None
original_dir = os.getcwd()
try:
frontend_dir = self.app_dir / "frontend"
if not frontend_dir.exists():
raise Exception(f"Frontend directory not found at {frontend_dir}")
print(f"Changing to frontend directory: {frontend_dir}")
os.chdir(frontend_dir)
# Create .loader.version file with the release tag
version_file = frontend_dir / ".loader.version"
with open(version_file, "w") as f:
f.write(self.release)
self.temp_files.append(str(version_file))
# Create a batch file to run the commands
batch_file = frontend_dir / "build_frontend.bat"
with open(batch_file, "w") as f:
f.write("@echo off\n")
f.write("call pnpm install\n")
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
f.write("call pnpm run build\n")
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
self.temp_files.append(str(batch_file))
print("Running build commands...")
result = subprocess.run([str(batch_file)], check=True, capture_output=True, text=True, shell=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Command failed: {e.cmd}")
print(f"Output: {e.output}")
print(f"Error: {e.stderr}")
raise Exception(f"Error building frontend: Command failed - {str(e)}")
except Exception as e:
print(f"Error building frontend: {str(e)}")
raise
finally:
# Always return to original directory
os.chdir(original_dir)
def prepare_backend(self):
"""Prepare backend files for building."""
print("Preparing backend files...")
print("Copying files according to Dockerfile structure...")
# Create src directory if it doesn't exist
os.makedirs(self.src_dir, exist_ok=True)
# Copy backend files from app/backend/decky_loader to src/decky_loader
print("Copying backend files...")
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader"),
os.path.join(self.src_dir, "decky_loader"),
dirs_exist_ok=True)
# Copy static, locales, and plugin directories to maintain decky_loader structure
os.makedirs(os.path.join(self.src_dir, "decky_loader"), exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "static"),
os.path.join(self.src_dir, "decky_loader", "static"),
dirs_exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "locales"),
os.path.join(self.src_dir, "decky_loader", "locales"),
dirs_exist_ok=True)
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "plugin"),
os.path.join(self.src_dir, "decky_loader", "plugin"),
dirs_exist_ok=True)
# Create legacy directory
os.makedirs(os.path.join(self.src_dir, "src", "legacy"), exist_ok=True)
# Copy main.py to src directory
shutil.copy2(os.path.join(self.app_dir, "backend", "main.py"),
os.path.join(self.src_dir, "main.py"))
# Create version file in the src directory
version_file = os.path.join(self.src_dir, ".loader.version")
with open(version_file, "w") as f:
f.write(self.release)
print("Backend preparation completed successfully!")
return True
def install_requirements(self):
"""Install Python requirements"""
print("Installing Python requirements...")
try:
# Try both requirements.txt and pyproject.toml
requirements_file = self.app_dir / "backend" / "requirements.txt"
pyproject_file = self.app_dir / "backend" / "pyproject.toml"
if requirements_file.exists():
subprocess.run([
sys.executable, "-m", "pip", "install", "--user", "-r", str(requirements_file)
], check=True)
elif pyproject_file.exists():
# Install core dependencies directly instead of using poetry
dependencies = [
"aiohttp>=3.8.1",
"psutil>=5.9.0",
"fastapi>=0.78.0",
"uvicorn>=0.17.6",
"python-multipart>=0.0.5",
"watchdog>=2.1.7",
"requests>=2.27.1",
"setuptools>=60.0.0",
"wheel>=0.37.1",
"winregistry>=1.1.1; platform_system == 'Windows'",
"pywin32>=303; platform_system == 'Windows'"
]
# Install each dependency
for dep in dependencies:
try:
subprocess.run([
sys.executable, "-m", "pip", "install", "--user", dep
], check=True)
except subprocess.CalledProcessError as e:
print(f"Warning: Failed to install {dep}: {str(e)}")
continue
else:
print("Warning: No requirements.txt or pyproject.toml found")
except Exception as e:
print(f"Error installing requirements: {str(e)}")
raise
def add_defender_exclusion(self, path):
"""Add Windows Defender exclusion for a path"""
try:
subprocess.run([
"powershell",
"-Command",
f"Add-MpPreference -ExclusionPath '{path}'"
], check=True, capture_output=True)
return True
except:
print("Warning: Could not add Windows Defender exclusion. You may need to run as administrator or manually add an exclusion.")
return False
def remove_defender_exclusion(self, path):
"""Remove Windows Defender exclusion for a path"""
try:
subprocess.run([
"powershell",
"-Command",
f"Remove-MpPreference -ExclusionPath '{path}'"
], check=True, capture_output=True)
except:
print("Warning: Could not remove Windows Defender exclusion.")
def build_executables(self):
"""Build executables using PyInstaller"""
print("\nBuilding executables...")
# Read version from .loader.version
version_file = os.path.join(self.app_dir, '.loader.version')
if not os.path.exists(version_file):
raise Exception("Version file not found. Run clone_repository first.")
with open(version_file, 'r') as f:
version = f.read().strip()
# Normalize version for Python packaging
# Convert v3.0.5-pre1 to 3.0.5rc1
py_version = version.lstrip('v') # Remove v prefix
if '-pre' in py_version:
py_version = py_version.replace('-pre', 'rc')
print(f"Building version: {version} (Python package version: {py_version})")
original_dir = os.getcwd()
backend_dir = os.path.join(self.app_dir, "backend")
dist_dir = os.path.join(backend_dir, "dist")
# Add Windows Defender exclusion for build directories
added_exclusion = self.add_defender_exclusion(backend_dir)
try:
os.chdir(backend_dir)
# Create setup.py with the correct version
setup_py = """
from setuptools import setup, find_packages
setup(
name="decky_loader",
version="%s",
packages=find_packages(),
package_data={
'decky_loader': [
'locales/*',
'static/*',
'.loader.version'
],
},
install_requires=[
'aiohttp>=3.8.1',
'certifi>=2022.6.15',
'packaging>=21.3',
'psutil>=5.9.1',
'requests>=2.28.1',
],
)
""" % py_version
with open("setup.py", "w") as f:
f.write(setup_py)
# Install the package in development mode
subprocess.run([sys.executable, "-m", "pip", "install", "-e", "."], check=True)
# Common PyInstaller arguments
pyinstaller_args = [
sys.executable,
"-m",
"PyInstaller",
"--clean",
"--noconfirm",
"pyinstaller.spec"
]
# First build console version
print("Building PluginLoader.exe (console version)...")
os.environ.pop('DECKY_NOCONSOLE', None) # Ensure env var is not set
subprocess.run(pyinstaller_args, check=True)
# Then build no-console version
print("Building PluginLoader_noconsole.exe...")
os.environ['DECKY_NOCONSOLE'] = '1'
subprocess.run(pyinstaller_args, check=True)
# Clean up environment
os.environ.pop('DECKY_NOCONSOLE', None)
# Copy the built executables to dist
os.makedirs(os.path.join(self.root_dir, "dist"), exist_ok=True)
if os.path.exists(os.path.join("dist", "PluginLoader.exe")):
shutil.copy2(
os.path.join("dist", "PluginLoader.exe"),
os.path.join(self.root_dir, "dist", "PluginLoader.exe")
)
else:
raise Exception("PluginLoader.exe not found after build")
if os.path.exists(os.path.join("dist", "PluginLoader_noconsole.exe")):
shutil.copy2(
os.path.join("dist", "PluginLoader_noconsole.exe"),
os.path.join(self.root_dir, "dist", "PluginLoader_noconsole.exe")
)
else:
raise Exception("PluginLoader_noconsole.exe not found after build")
print("Successfully built executables")
except subprocess.CalledProcessError as e:
raise Exception(f"Failed to build executables: {str(e)}")
finally:
if added_exclusion:
self.remove_defender_exclusion(backend_dir)
os.chdir(original_dir)
def install_files(self):
"""Install files to homebrew directory"""
print("\nInstalling files to homebrew directory...")
# Create homebrew directory if it doesn't exist
homebrew_dir = os.path.join(os.path.expanduser("~"), "homebrew")
services_dir = os.path.join(homebrew_dir, "services")
os.makedirs(services_dir, exist_ok=True)
try:
# Copy PluginLoader.exe and PluginLoader_noconsole.exe
for exe_name in ["PluginLoader.exe", "PluginLoader_noconsole.exe"]:
exe_source = os.path.join(self.root_dir, "dist", exe_name)
exe_dest = os.path.join(services_dir, exe_name)
if not os.path.exists(exe_source):
raise Exception(f"{exe_name} not found at {exe_source}")
shutil.copy2(exe_source, exe_dest)
# Create .loader.version file
version_file = os.path.join(services_dir, ".loader.version")
with open(version_file, "w") as f:
f.write(self.release)
print("Successfully installed files")
except Exception as e:
raise Exception(f"Failed to copy files to homebrew: {str(e)}")
def install_nodejs(self):
"""Install Node.js v18.18.0 with npm"""
print("Installing Node.js v18.18.0...")
try:
# First check if Node.js v18.18.0 is already installed in common locations
nodejs_paths = [
r"C:\Program Files\nodejs\node.exe",
r"C:\Program Files (x86)\nodejs\node.exe",
os.path.expandvars(r"%APPDATA%\Local\Programs\nodejs\node.exe")
]
# Try to use existing Node.js 18.18.0 first
for node_path in nodejs_paths:
if os.path.exists(node_path):
try:
version = subprocess.run([node_path, "--version"], capture_output=True, text=True).stdout.strip()
if version.startswith("v18.18.0"):
print(f"Found Node.js {version} at {node_path}")
node_dir = os.path.dirname(node_path)
if node_dir not in os.environ["PATH"]:
os.environ["PATH"] = node_dir + os.pathsep + os.environ["PATH"]
return True
except:
continue
# If we get here, we need to install Node.js 18.18.0
print("Installing Node.js v18.18.0...")
# Create temp directory for downloads
temp_dir = self.root_dir / "temp"
temp_dir.mkdir(exist_ok=True)
# Download Node.js installer
node_installer = temp_dir / "node-v18.18.0-x64.msi"
if not node_installer.exists():
print("Downloading Node.js installer...")
try:
import urllib.request
urllib.request.urlretrieve(
"https://nodejs.org/dist/v18.18.0/node-v18.18.0-x64.msi",
node_installer
)
except Exception as e:
print(f"Error downloading Node.js installer: {str(e)}")
raise
# Install Node.js silently
print("Installing Node.js (this may take a few minutes)...")
try:
# First try to uninstall any existing Node.js using PowerShell
uninstall_cmd = 'Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*Node.js*" } | ForEach-Object { $_.Uninstall() }'
subprocess.run(["powershell", "-Command", uninstall_cmd], capture_output=True, timeout=60)
# Wait a bit for uninstallation to complete
time.sleep(5)
# Now install Node.js 18.18.0
subprocess.run(
["msiexec", "/i", str(node_installer), "/qn", "ADDLOCAL=ALL"],
check=True,
timeout=300 # 5 minute timeout
)
print("Waiting for Node.js installation to complete...")
time.sleep(10)
# Add to PATH
nodejs_path = r"C:\Program Files\nodejs"
npm_path = os.path.join(os.environ["APPDATA"], "npm")
# Update PATH for current process
if nodejs_path not in os.environ["PATH"]:
os.environ["PATH"] = nodejs_path + os.pathsep + os.environ["PATH"]
if npm_path not in os.environ["PATH"]:
os.environ["PATH"] = npm_path + os.pathsep + os.environ["PATH"]
# Verify installation
node_version = subprocess.run(["node", "--version"], capture_output=True, text=True, check=True).stdout.strip()
if not node_version.startswith("v18.18.0"):
raise Exception(f"Wrong Node.js version installed: {node_version}")
npm_version = subprocess.run(["npm", "--version"], capture_output=True, text=True, check=True).stdout.strip()
print(f"Successfully installed Node.js {node_version} with npm {npm_version}")
# Clean up
self.safe_remove_directory(temp_dir)
return True
except subprocess.TimeoutExpired:
print("Installation timed out. Please try installing Node.js v18.18.0 manually.")
raise
except Exception as e:
print(f"Installation failed: {str(e)}")
raise
except Exception as e:
print(f"Error installing Node.js: {str(e)}")
raise
def setup_steam_config(self):
"""Configure Steam for Decky Loader"""
print("Configuring Steam...")
try:
# Add -dev argument to Steam shortcut
import winreg
steam_path = None
# Try to find Steam installation path from registry
try:
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Valve\Steam") as key:
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
except:
try:
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Valve\Steam") as key:
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
except:
print("Steam installation not found in registry")
if steam_path:
steam_exe = Path(steam_path) / "steam.exe"
if steam_exe.exists():
# Create .cef-enable-remote-debugging file
debug_file = Path(steam_path) / ".cef-enable-remote-debugging"
debug_file.touch()
print("Created .cef-enable-remote-debugging file")
# Create/modify Steam shortcut
desktop = Path.home() / "Desktop"
shortcut_path = desktop / "Steam.lnk"
import pythoncom
from win32com.client import Dispatch
shell = Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut(str(shortcut_path))
shortcut.Targetpath = str(steam_exe)
shortcut.Arguments = "-dev"
shortcut.save()
print("Created Steam shortcut with -dev argument")
except Exception as e:
print(f"Error configuring Steam: {str(e)}")
raise
def setup_autostart(self):
"""Setup PluginLoader to run at startup"""
print("Setting up autostart...")
try:
# Get the path to the no-console executable
services_dir = os.path.join(os.path.expanduser("~"), "homebrew", "services")
plugin_loader = os.path.join(services_dir, "PluginLoader_noconsole.exe")
# Get the Windows Startup folder path
startup_folder = os.path.join(os.environ["APPDATA"], "Microsoft", "Windows", "Start Menu", "Programs", "Startup")
# Create a batch file in the startup folder
startup_bat = os.path.join(startup_folder, "start_decky.bat")
# Write the batch file with proper path escaping
with open(startup_bat, "w") as f:
f.write(f'@echo off\n"{plugin_loader}"')
print(f"Created startup script at: {startup_bat}")
return True
except Exception as e:
print(f"Error setting up autostart: {str(e)}")
return False
def check_python_version(self):
"""Check if correct Python version is being used"""
print("Checking Python version...")
if sys.version_info.major != 3 or sys.version_info.minor != 11:
raise Exception("This script requires Python 3.11. Please run using decky_builder.bat")
def check_dependencies(self):
"""Check and install required dependencies"""
print("Checking dependencies...")
try:
# Check Node.js and npm first
try:
# Use shell=True to find node in PATH
node_version = subprocess.run("node --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
npm_version = subprocess.run("npm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
# Check if version meets requirements
if not node_version.startswith("v18."):
print(f"Node.js {node_version} found, but v18.18.0 is required")
self.install_nodejs()
else:
print(f"Node.js {node_version} with npm {npm_version} is installed")
except Exception as e:
print(f"Node.js/npm not found or error: {str(e)}")
self.install_nodejs()
# Install pnpm globally if not present
try:
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"pnpm version {pnpm_version} is installed")
except:
print("Installing pnpm globally...")
subprocess.run("npm i -g pnpm", shell=True, check=True)
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"Installed pnpm version {pnpm_version}")
# Check git
try:
git_version = subprocess.run("git --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
print(f"{git_version} is installed")
except:
raise Exception("git is not installed. Please install git from https://git-scm.com/downloads")
print("All dependencies are satisfied")
except Exception as e:
print(f"Error checking dependencies: {str(e)}")
raise
def get_release_versions(self):
"""Get list of available release versions"""
print("Fetching available versions...")
try:
response = requests.get(
"https://api.github.com/repos/SteamDeckHomebrew/decky-loader/releases"
)
response.raise_for_status()
releases = response.json()
# Split releases into stable and pre-release
stable_releases = []
pre_releases = []
for release in releases:
version = release['tag_name']
if release['prerelease']:
pre_releases.append(version)
else:
stable_releases.append(version)
# Sort versions and take only the latest 3 of each
stable_releases.sort(reverse=True)
pre_releases.sort(reverse=True)
stable_releases = stable_releases[:3]
pre_releases = pre_releases[:3]
# Combine and sort all versions
all_versions = stable_releases + pre_releases
all_versions.sort(reverse=True)
return all_versions
except requests.RequestException as e:
raise Exception(f"Failed to fetch release versions: {str(e)}")
def prompt_for_version(self):
"""Prompt the user to select a version to install."""
versions = self.get_release_versions()
print("\nAvailable versions:")
print("Stable versions:")
stable_count = 0
for i, version in enumerate(versions):
if '-pre' not in version:
print(f"{i+1}. {version}")
stable_count += 1
print("\nPre-release versions:")
for i, version in enumerate(versions):
if '-pre' in version:
print(f"{i+1}. {version}")
while True:
try:
choice = input("\nSelect a version (1-{}): ".format(len(versions)))
index = int(choice) - 1
if 0 <= index < len(versions):
return versions[index]
print("Invalid selection, please try again.")
except ValueError:
print("Invalid input, please enter a number.")
def terminate_processes(self):
"""Terminate running instances of executables that may interfere with the build."""
for proc in psutil.process_iter(['pid', 'name', 'exe']):
if proc.info['name'] in ['PluginLoader.exe', 'PluginLoader_noconsole.exe']:
try:
proc.terminate()
proc.wait()
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
def run(self):
"""Run the build and installation process."""
# Terminate interfering processes
self.terminate_processes()
try:
print("Starting Decky Loader build process...")
self.check_python_version()
self.check_dependencies()
self.setup_directories()
self.clone_repository()
self.setup_homebrew()
self.build_frontend()
self.prepare_backend()
self.install_requirements()
self.build_executables()
self.install_files()
self.setup_steam_config()
self.setup_autostart()
print("\nBuild process completed successfully!")
print("\nNext steps:")
print("1. Close Steam if it's running")
print("2. Launch Steam using the new shortcut on your desktop")
print("3. Enter Big Picture Mode")
print("4. Hold the STEAM button and press A to access the Decky menu")
except Exception as e:
print(f"Error during build process: {str(e)}")
raise
finally:
self.cleanup()
def main():
parser = argparse.ArgumentParser(description='Build and Install Decky Loader for Windows')
parser.add_argument('--release', required=False, default=None,
help='Release version/branch to build (if not specified, will prompt for version)')
args = parser.parse_args()
try:
builder = DeckyBuilder(args.release)
builder.run()
print(f"\nDecky Loader has been installed to: {builder.user_homebrew_dir}")
except Exception as e:
print(f"Error during build process: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -1,90 +0,0 @@
@echo off
setlocal EnableDelayedExpansion
:: Check for admin privileges
net session >nul 2>&1
if %errorlevel% neq 0 (
echo This script requires administrator privileges.
echo Please run this script as administrator.
pause
exit /b 1
)
:: Check Python version
echo Checking Python version...
where python >nul 2>nul
if %errorlevel% neq 0 (
echo Python is not installed or not in PATH
echo Please install Python and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('python -c "import sys; print(sys.executable)"') do set PYTHON_PATH=%%i
:: Check dependencies
echo Checking dependencies...
:: Check Node.js and npm
where node >nul 2>nul
if %errorlevel% neq 0 (
echo Node.js is not installed or not in PATH
echo Please install Node.js and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('node -v') do set NODE_VERSION=%%i
for /f "tokens=*" %%i in ('npm -v') do set NPM_VERSION=%%i
echo Node.js !NODE_VERSION! with npm !NPM_VERSION! is installed
:: Add npm global path to PATH
for /f "tokens=*" %%i in ('npm config get prefix') do set NPM_PREFIX=%%i
set "PATH=%NPM_PREFIX%;%PATH%"
:: Ensure pnpm is installed globally
where pnpm >nul 2>nul
if %errorlevel% neq 0 (
echo Installing pnpm globally...
npm install -g pnpm
)
:: Get pnpm version
for /f "tokens=*" %%i in ('pnpm -v') do set PNPM_VERSION=%%i
echo pnpm version !PNPM_VERSION! is installed
:: Check git
where git >nul 2>nul
if %errorlevel% neq 0 (
echo git is not installed or not in PATH
echo Please install git and try again
pause
exit /b 1
)
for /f "tokens=*" %%i in ('git --version') do set GIT_VERSION=%%i
echo !GIT_VERSION! is installed
echo All dependencies are satisfied
:: Get the directory of this batch file
set "SCRIPT_DIR=%~dp0"
:: Run the Python script with full environment
echo Running Decky Loader installer...
"%PYTHON_PATH%" "%SCRIPT_DIR%decky_builder.py"
if errorlevel 1 (
echo Error during build process: %ERRORLEVEL%
:: Clean up any remaining processes
taskkill /F /IM python.exe /T >nul 2>&1
taskkill /F /IM node.exe /T >nul 2>&1
exit /b %ERRORLEVEL%
)
:: Clean up any remaining processes
taskkill /F /IM python.exe /T >nul 2>&1
taskkill /F /IM node.exe /T >nul 2>&1
echo Build completed successfully.
pause