Compare commits

..

4 Commits

Author SHA1 Message Date
Josiah Glosson
a47af1b37d With *an* admin prompt 2025-08-06 21:41:15 -05:00
Josiah Glosson
3777373d71 Properly remove old shortcuts 2025-08-06 20:52:35 -05:00
Josiah Glosson
ef32c23a5d Add ShellExecuteWait credit 2025-08-06 20:47:31 -05:00
Josiah Glosson
e07d389759 Make Windows app installations per-user once again 2025-08-06 20:46:55 -05:00
4 changed files with 68 additions and 51 deletions

View File

@ -4,7 +4,7 @@ root = true
[*] [*]
charset = utf-8 charset = utf-8
indent_style = space indent_style = space
indent_size = 2 indent_size = 4
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
@ -13,6 +13,3 @@ max_line_length = 100
[*.md] [*.md]
max_line_length = off max_line_length = off
trim_trailing_whitespace = false trim_trailing_whitespace = false
[*.{rs,java,kts}]
indent_size = 4

View File

@ -1,41 +1,67 @@
!macro NSIS_HOOK_POSTINSTALL ; https://nsis.sourceforge.io/ShellExecWait
SetShellVarContext current !macro ShellExecWait verb app param workdir show exitoutvar ;only app and show must be != "", every thing else is optional
#define SEE_MASK_NOCLOSEPROCESS 0x40
IfFileExists "$LOCALAPPDATA${PRODUCTNAME}\theseus_gui.exe" file_found file_not_found System::Store S
file_found: !if "${NSIS_PTR_SIZE}" > 4
Delete "$LOCALAPPDATA${PRODUCTNAME}\theseus_gui.exe" !define /ReDef /math SYSSIZEOF_SHELLEXECUTEINFO 14 * ${NSIS_PTR_SIZE}
!else ifndef SYSSIZEOF_SHELLEXECUTEINFO
Delete "$LOCALAPPDATA${PRODUCTNAME}\uninstall.exe" !define SYSSIZEOF_SHELLEXECUTEINFO 60
RMDir "$LOCALAPPDATA${PRODUCTNAME}" !endif
System::Call '*(&i${SYSSIZEOF_SHELLEXECUTEINFO})i.r0'
!insertmacro DeleteAppUserModelId System::Call '*$0(i ${SYSSIZEOF_SHELLEXECUTEINFO},i 0x40,p $hwndparent,t "${verb}",t $\'${app}$\',t $\'${param}$\',t "${workdir}",i ${show})p.r0'
System::Call 'shell32::ShellExecuteEx(t)(pr0)i.r1 ?e' ; (t) to trigger A/W selection
; Remove start menu shortcut ${If} $1 <> 0
!insertmacro MUI_STARTMENU_GETFOLDER Application $AppStartMenuFolder System::Call '*$0(is,i,p,p,p,p,p,p,p,p,p,p,p,p,p.r1)' ;stack value not really used, just a fancy pop ;)
!insertmacro IsShortcutTarget "$SMPROGRAMS$AppStartMenuFolder${PRODUCTNAME}.lnk" "$LOCALAPPDATA${PRODUCTNAME}\theseus_gui.exe" System::Call 'kernel32::WaitForSingleObject(pr1,i-1)'
Pop $0 System::Call 'kernel32::GetExitCodeProcess(pr1,*i.s)'
${If} $0 = 1 System::Call 'kernel32::CloseHandle(pr1)'
!insertmacro UnpinShortcut "$SMPROGRAMS$AppStartMenuFolder${PRODUCTNAME}.lnk" ${EndIf}
Delete "$SMPROGRAMS$AppStartMenuFolder${PRODUCTNAME}.lnk" System::Free $0
RMDir "$SMPROGRAMS$AppStartMenuFolder" !if "${exitoutvar}" == ""
pop $0
!endif
System::Store L
!if "${exitoutvar}" != ""
pop ${exitoutvar}
!endif
!macroend
; --------------------------------------------------------------------------------
Var /GLOBAL OldInstallDir
!macro NSIS_HOOK_PREINSTALL
SetShellVarContext all
${If} ${FileExists} "$SMPROGRAMS\${PRODUCTNAME}.lnk"
UserInfo::GetAccountType
Pop $0
${If} $0 != "Admin"
MessageBox MB_ICONINFORMATION|MB_OK "An old installation of the Modrinth App was detected that requires administrator permission to update from. You will be prompted with an admin prompt shortly."
${EndIf}
ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
ReadRegStr $OldInstallDir SHCTX "${UNINSTKEY}" "InstallLocation"
StrCpy $OldInstallDir $OldInstallDir "" 1
StrCpy $OldInstallDir $OldInstallDir -1 ""
DetailPrint "Executing $R1"
!insertmacro ShellExecWait "runas" '$R1' '/P _?=$4' "" ${SW_SHOW} $3
${If} $3 <> 0
SetErrorLevel $3
MessageBox MB_ICONEXCLAMATION|MB_OK "Failed to uninstall old global installation"
Abort
${EndIf}
${EndIf}
SetShellVarContext current
!macroend
!macro NSIS_HOOK_POSTINSTALL
!insertmacro IsShortcutTarget "$DESKTOP\${PRODUCTNAME}.lnk" "$OldInstallDir\${MAINBINARYNAME}.exe"
Pop $0
${If} $0 = 1
!insertmacro SetShortcutTarget "$DESKTOP\${PRODUCTNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
Return
${EndIf} ${EndIf}
!insertmacro IsShortcutTarget "$SMPROGRAMS${PRODUCTNAME}.lnk" "$LOCALAPPDATA${PRODUCTNAME}\theseus_gui.exe"
Pop $0
${If} $0 = 1
!insertmacro UnpinShortcut "$SMPROGRAMS${PRODUCTNAME}.lnk"
Delete "$SMPROGRAMS${PRODUCTNAME}.lnk"
${EndIf}
!insertmacro IsShortcutTarget "$DESKTOP${PRODUCTNAME}.lnk" "$LOCALAPPDATA${PRODUCTNAME}\theseus_gui.exe"
Pop $0
${If} $0 = 1
!insertmacro UnpinShortcut "$DESKTOP${PRODUCTNAME}.lnk"
Delete "$DESKTOP${PRODUCTNAME}.lnk"
${EndIf}
DeleteRegKey HKCU "${UNINSTKEY}"
goto end_of_test ;<== important for not continuing on the else branch
file_not_found:
end_of_test:
!macroend !macroend

View File

@ -15,7 +15,6 @@
"icon": ["icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], "icon": ["icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"],
"windows": { "windows": {
"nsis": { "nsis": {
"installMode": "perMachine",
"installerHooks": "./nsis/hooks.nsi" "installerHooks": "./nsis/hooks.nsi"
} }
}, },

View File

@ -143,13 +143,8 @@ export default defineNuxtConfig({
state.lastGenerated && state.lastGenerated &&
new Date(state.lastGenerated).getTime() + TTL > new Date().getTime() && new Date(state.lastGenerated).getTime() + TTL > new Date().getTime() &&
// ...but only if the API URL is the same // ...but only if the API URL is the same
state.apiUrl === API_URL && state.apiUrl === API_URL
// ...and if no errors were caught during the last generation
(state.errors ?? []).length === 0
) { ) {
console.log(
"Tags already recently generated. Delete apps/frontend/generated/state.json to force regeneration.",
);
return; return;
} }