feat: implement substitute/absolute paths

This commit is contained in:
Yannik Schmidt
2025-07-05 20:40:00 +02:00
parent d2fdc44eef
commit 2b701825b3
3 changed files with 35 additions and 3 deletions

View File

@@ -4,6 +4,7 @@ import customtkinter
import imagetools import imagetools
import os import os
import statekeeper import statekeeper
import localaction
def show_large_picture(app, path): def show_large_picture(app, path):
'''Show a full-window version of the clicked picture''' '''Show a full-window version of the clicked picture'''
@@ -160,6 +161,7 @@ def create_details_page(app, software, backswitch_function, infowidget_window):
print(software.run_exe) print(software.run_exe)
print(os.path.join(software.backend.install_dir, software.run_exe or "")) print(os.path.join(software.backend.install_dir, software.run_exe or ""))
if not software.run_exe or not (os.path.isfile(software.run_exe) if not software.run_exe or not (os.path.isfile(software.run_exe)
or localaction.check_substitute_path_exists(software.run_exe)
or os.path.isfile(os.path.join(software.backend.install_dir, software.title, software.run_exe))): or os.path.isfile(os.path.join(software.backend.install_dir, software.title, software.run_exe))):
run_button.configure(state=tkinter.DISABLED) run_button.configure(state=tkinter.DISABLED)
run_button.configure(fg_color="gray") run_button.configure(fg_color="gray")

View File

@@ -2,6 +2,8 @@ import subprocess
import sys import sys
import os import os
import json import json
import win32com.client
import pythoncom
# windows imports # # windows imports #
if os.name == "nt": if os.name == "nt":
@@ -43,6 +45,19 @@ def resolve_lnk(lnk_file_path):
else: else:
return lnk_file_path # not required on linux return lnk_file_path # not required on linux
def substitute_win_paths(path):
pythoncom.CoInitialize()
shell = win32com.client.Dispatch("WScript.Shell")
common_programs = shell.SpecialFolders("AllUsersPrograms")
path = path.replace("%ProgramData%", common_programs)
return path
def check_substitute_path_exists(path):
if "%" in path:
return os.path.isfile(substitute_win_paths(path))
def run_exe(path, synchronous=False): def run_exe(path, synchronous=False):
'''Launches a given software''' '''Launches a given software'''
@@ -65,13 +80,23 @@ def run_exe(path, synchronous=False):
if synchronous: if synchronous:
raise NotImplementedError("SYNC not yet implemented") raise NotImplementedError("SYNC not yet implemented")
print("Raw paths:", paths)
# substitute program data #
paths = [ substitute_win_paths(p) for p in paths ]
# substituted paths #
print("Subs paths:", paths)
# resolve links #
paths = [resolve_lnk(p) if p.endswith(".lnk") else p for p in paths] paths = [resolve_lnk(p) if p.endswith(".lnk") else p for p in paths]
print("Executing:", paths) print("Executing prepared:", paths)
try: try:
if paths[0].endswith(".reg"): if paths[0].endswith(".reg"):
raise OSError("WinError 740") raise OSError("WinError 740")
path = paths[0].replace("\\\\", "\\")
subprocess.Popen(path, cwd=os.path.dirname(paths[0])) # TODO fix this BS subprocess.Popen(path, cwd=os.path.dirname(paths[0])) # TODO fix this BS
except OSError as e: except OSError as e:
if "WinError 740" in str(e): if "WinError 740" in str(e):

View File

@@ -184,8 +184,10 @@ class Software:
s.install() s.install()
# run installer if set # # run installer if set #
print("self.installer", self.installer)
if self.installer: if self.installer:
installer_path = os.path.join(self.backend.install_dir, self.title, self.installer) installer_path = os.path.join(self.backend.install_dir, self.title, self.installer)
print("installer path in if", installer_path)
if os.name != "nt" and not os.path.isabs(installer_path): if os.name != "nt" and not os.path.isabs(installer_path):
# need abs path for wine # # need abs path for wine #
installer_path = os.path.join(os.getcwd(), installer_path) installer_path = os.path.join(os.getcwd(), installer_path)
@@ -228,6 +230,9 @@ class Software:
if self.run_exe: if self.run_exe:
if os.name == "nt" or not ".lnk" in self.run_exe: if os.name == "nt" or not ".lnk" in self.run_exe:
if self.run_exe.startswith("%") or self.run_exe[1] == ":":
localaction.run_exe(self.run_exe)
else:
localaction.run_exe(os.path.join(self.backend.install_dir, self.title, self.run_exe)) localaction.run_exe(os.path.join(self.backend.install_dir, self.title, self.run_exe))
else: else:
localaction.run_exe(self.run_exe) localaction.run_exe(self.run_exe)