-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAppRun
More file actions
138 lines (118 loc) · 5.24 KB
/
Copy pathAppRun
File metadata and controls
138 lines (118 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
HERE="$(dirname "$(readlink -f "${0}")")"
export PATH="${HERE}/usr/wine/bin:${PATH}"
export WINELOADER="${HERE}/usr/wine/bin/wine"
export WINEDLLPATH="${HERE}/usr/wine/lib/wine"
export LD_LIBRARY_PATH="${HERE}/usr/wine/lib:${LD_LIBRARY_PATH}"
export DXVK_ASYNC=0
export DXVK_CONFIG="d3d9.deferSurfaceCreation = True; d3d9.shaderModel = 1"
export VKD3D_FEATURE_LEVEL=12_1
export VKD3D_SHADER_MODEL=6_5
export VKD3D_DISABLE_EXTENSIONS=VK_KHR_present_id
export DXVK_NVAPI_ALLOW_OTHER_DRIVERS=1
USER_WINEPREFIX="${HOME}/.AffinityLinux-Appimage"
APPIMAGE_WINEPREFIX="${HERE}/usr/wineprefix"
APPIMAGE_VKD3D="${APPIMAGE_WINEPREFIX}/vkd3d_dlls"
# Version-String-Vergleich (robuster als Timestamp-Vergleich mit -nt)
APPIMAGE_VERSION=$(cat "${APPIMAGE_WINEPREFIX}/.appimage-version" 2>/dev/null || echo "")
USER_VERSION=$(cat "${USER_WINEPREFIX}/.appimage-version" 2>/dev/null || echo "")
FIRST_RUN=0
NEED_COPY=0
if [ ! -d "${USER_WINEPREFIX}" ]; then
NEED_COPY=1
FIRST_RUN=1
elif [ -z "${USER_VERSION}" ] || [ "${APPIMAGE_VERSION}" != "${USER_VERSION}" ]; then
NEED_COPY=1
fi
if [ ${NEED_COPY} -eq 1 ]; then
if [ ${FIRST_RUN} -eq 1 ]; then
echo "Setting up Affinity wineprefix (first run, this may take a moment)..."
mkdir -p "$(dirname "${USER_WINEPREFIX}")"
else
echo "Updating Affinity wineprefix to version ${APPIMAGE_VERSION}..."
fi
if command -v rsync >/dev/null 2>&1; then
rsync -a --info=progress2 "${APPIMAGE_WINEPREFIX}/" "${USER_WINEPREFIX}/" 2>/dev/null || \
rsync -a "${APPIMAGE_WINEPREFIX}/" "${USER_WINEPREFIX}/"
else
cp -r "${APPIMAGE_WINEPREFIX}"/* "${USER_WINEPREFIX}/" 2>/dev/null || true
cp -r "${APPIMAGE_WINEPREFIX}"/.[!.]* "${USER_WINEPREFIX}/" 2>/dev/null || true
fi
cp "${APPIMAGE_WINEPREFIX}/.appimage-version" "${USER_WINEPREFIX}/.appimage-version" 2>/dev/null || \
touch "${USER_WINEPREFIX}/.appimage-version"
CURRENT_USER="${USER:-$(whoami)}"
OLD_USER=$(cat "${USER_WINEPREFIX}/.appimage-user" 2>/dev/null || echo "matt")
if [ "${CURRENT_USER}" != "${OLD_USER}" ]; then
echo "Updating username from '${OLD_USER}' to '${CURRENT_USER}'..."
# Wine-Registry-Dateien nutzen \\ (2 Backslashes) als Pfadtrenner.
# sed mit \\\\users\\\\<user> trifft nur einfache Backslashes - Python ist zuverlässiger.
OLD_USER="${OLD_USER}" NEW_USER="${CURRENT_USER}" PREFIX="${USER_WINEPREFIX}" python3 << 'PYEOF'
import os
old = os.environ['OLD_USER']
new = os.environ['NEW_USER']
prefix = os.environ['PREFIX']
for name in ('user.reg', 'userdef.reg', 'system.reg'):
path = os.path.join(prefix, name)
if not os.path.exists(path):
continue
with open(path, 'r') as f:
content = f.read()
content = content.replace('\\\\users\\\\' + old, '\\\\users\\\\' + new)
content = content.replace('\\\\home\\\\' + old, '\\\\home\\\\' + new)
content = content.replace('"USERNAME"="' + old + '"', '"USERNAME"="' + new + '"')
with open(path, 'w') as f:
f.write(content)
PYEOF
OLD_USER_DIR="${USER_WINEPREFIX}/drive_c/users/${OLD_USER}"
NEW_USER_DIR="${USER_WINEPREFIX}/drive_c/users/${CURRENT_USER}"
if [ -d "${OLD_USER_DIR}" ] && [ ! -d "${NEW_USER_DIR}" ]; then
mv "${OLD_USER_DIR}" "${NEW_USER_DIR}"
echo "Renamed user directory: ${OLD_USER_DIR} -> ${NEW_USER_DIR}"
fi
fi
echo "Wineprefix setup complete."
# GPU-Erkennung: nvapi-DLL-Overrides nur für NVIDIA aktivieren
GPU_VENDOR="unknown"
if command -v lspci >/dev/null 2>&1; then
if lspci 2>/dev/null | grep -qi "nvidia"; then
GPU_VENDOR="nvidia"
elif lspci 2>/dev/null | grep -Eqi "amd|radeon|advanced micro"; then
GPU_VENDOR="amd"
elif lspci 2>/dev/null | grep -qi "intel.*graphics\|intel.*vga"; then
GPU_VENDOR="intel"
fi
fi
NVAPI_SYS32="${USER_WINEPREFIX}/drive_c/windows/system32/nvapi64.dll"
if [ "$GPU_VENDOR" = "nvidia" ] && [ -f "$NVAPI_SYS32" ]; then
echo "NVIDIA GPU erkannt — aktiviere dxvk-nvapi..."
_NVAPI_REG=$(mktemp /tmp/affinity-nvapi-XXXXXX.reg)
printf 'REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\DllOverrides]\n"nvapi"="native"\n"nvapi64"="native"\n"nvofapi64"="native"\n' \
> "$_NVAPI_REG"
WINEPREFIX="${USER_WINEPREFIX}" "${WINELOADER}" regedit "$_NVAPI_REG" 2>/dev/null
rm -f "$_NVAPI_REG"
echo "dxvk-nvapi aktiviert."
else
echo "GPU: ${GPU_VENDOR} — dxvk-nvapi nicht aktiviert."
fi
fi
export WINEPREFIX="${USER_WINEPREFIX}"
if [ -d "${APPIMAGE_VKD3D}" ]; then
USER_VKD3D="${USER_WINEPREFIX}/vkd3d_dlls"
if [ ! -d "${USER_VKD3D}" ]; then
mkdir -p "${USER_VKD3D}"
cp -r "${APPIMAGE_VKD3D}"/* "${USER_VKD3D}/" 2>/dev/null || true
fi
export WINEDLLPATH="${WINEDLLPATH}:${USER_VKD3D}"
fi
if [ "$1" = "--dpi" ]; then
"${HERE}/usr/bin/affinity-dpi-config"
exit $?
fi
if [ "$1" = "--winecfg" ]; then
exec "${WINELOADER}" winecfg
fi
if [ ${NEED_COPY} -eq 1 ]; then
# DPI-Dialog bei erstem Start UND bei Versions-Update, weil rsync user.reg überschreibt
"${HERE}/usr/bin/affinity-dpi-config"
fi
exec "${WINELOADER}" "${WINEPREFIX}/drive_c/Program Files/Affinity/Affinity/Affinity.exe" "$@"