This commit is contained in:
gfdgd xi 2022-09-12 19:17:52 +08:00
parent b45b88902c
commit a8749b8f7c
22 changed files with 3863 additions and 85 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

328
Icon/Unknown.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

267
Icon/迅雷.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

16
buildshell/main.py Normal file
View File

@ -0,0 +1,16 @@
import apt_pkg
import os
import apt_inst
import aptsources.distinfo
#print(apt_pkg.Cache.packages)
apt_pkg.init()
# 先更新
os.system("sudo apt ssupdate && sudo apt upgrade -y")
#apt_inst
version = apt_pkg.Cache()["winehq-staging"].current_ver.ver_str
#version = apt_pkg.Package()["live-filesystem"].current_ver.arch
try:
new = version[: version.index("~")]
except:
new = version
# 差异对比

View File

@ -1,5 +1,5 @@
Package: spark-deepin-wine-runner Package: spark-deepin-wine-runner
Version: 2.2.0 Version: 2.2.0-Alpha2
Maintainer: gfdgd xi <3025613752@qq.com>, 为什么您不喜欢熊出没和阿布呢 Maintainer: gfdgd xi <3025613752@qq.com>, 为什么您不喜欢熊出没和阿布呢
Homepage: https://gitee.com/gfdgd-xi/deep-wine-runner, https://github.com/gfdgd-xi/deep-wine-runner, https://gitlink.org.cn/gfdgd_xi/deep-wine-runner Homepage: https://gitee.com/gfdgd-xi/deep-wine-runner, https://github.com/gfdgd-xi/deep-wine-runner, https://gitlink.org.cn/gfdgd_xi/deep-wine-runner
Architecture: all Architecture: all
@ -9,7 +9,7 @@ Recommends: winbind
Section: utils Section: utils
Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52 Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52
Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52 Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52
Installed-Size: 24948 Installed-Size: 25152
Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器 Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器
2.1.0-1 更新内容: 2.1.0-1 更新内容:
※1、删除多余图标 ※1、删除多余图标

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 91 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -18,6 +18,8 @@ try:
netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/net/list.json").text) netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/net/list.json").text)
except: except:
netList = [ netList = [
["Microsoft® .NET Framework 1.1 版可转散发套件", "https://download.microsoft.com/download/8/2/7/827bb1ef-f5e1-4464-9788-40ef682930fd/dotnetfx.exe"],
["Microsoft .NET Framework 2.0 Service Pack 1 (x86)", "https://download.microsoft.com/download/0/8/c/08c19fa4-4c4f-4ffb-9d6c-150906578c9e/NetFx20SP1_x86.exe"],
["3.5 SP1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/b635098a-2d1d-4142-bef6-d237545123cb/2651b87007440a15209cac29634a4e45/dotnetfx35.exe"], ["3.5 SP1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/b635098a-2d1d-4142-bef6-d237545123cb/2651b87007440a15209cac29634a4e45/dotnetfx35.exe"],
["4.0 Offline Installer", "https://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe"], ["4.0 Offline Installer", "https://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe"],
["4.5 Web Installer", "https://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe"], ["4.5 Web Installer", "https://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe"],
@ -29,7 +31,18 @@ except:
["4.7 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2dfcc711-bb60-421a-a17b-76c63f8d1907/e5c0231bd5d51fffe65f8ed7516de46a/ndp47-kb3186497-x86-x64-allos-enu.exe"], ["4.7 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2dfcc711-bb60-421a-a17b-76c63f8d1907/e5c0231bd5d51fffe65f8ed7516de46a/ndp47-kb3186497-x86-x64-allos-enu.exe"],
["4.7.1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/4312fa21-59b0-4451-9482-a1376f7f3ba4/9947fce13c11105b48cba170494e787f/ndp471-kb4033342-x86-x64-allos-enu.exe"], ["4.7.1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/4312fa21-59b0-4451-9482-a1376f7f3ba4/9947fce13c11105b48cba170494e787f/ndp471-kb4033342-x86-x64-allos-enu.exe"],
["4.7.2 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c59-9ba66bcf15f6/089f837de42708daacaae7c04b7494db/ndp472-kb4054530-x86-x64-allos-enu.exe"], ["4.7.2 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c59-9ba66bcf15f6/089f837de42708daacaae7c04b7494db/ndp472-kb4054530-x86-x64-allos-enu.exe"],
["4.8 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe"] ["4.8 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe"],
["4.8.1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/6f083c7e-bd40-44d4-9e3f-ffba71ec8b09/3951fd5af6098f2c7e8ff5c331a0679c/ndp481-x86-x64-allos-enu.exe"],
[".NET 5.0 Desktop Runtime (v5.0.17) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/b6fe5f2a-95f4-46f1-9824-f5994f10bc69/db5ec9b47ec877b5276f83a185fdb6a0/windowsdesktop-runtime-5.0.17-win-x86.exe"],
[".NET 5.0 Desktop Runtime (v5.0.17) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/3aa4e942-42cd-4bf5-afe7-fc23bd9c69c5/64da54c8864e473c19a7d3de15790418/windowsdesktop-runtime-5.0.17-win-x64.exe"],
[".NET 5.0 Desktop Runtime (v5.0.17) - Windows Arm64 Installer", "https://download.visualstudio.microsoft.com/download/pr/be25784a-4231-4c53-ba6e-869166ef523f/9602c6c0d358d31dc710fd0573fc39e0/windowsdesktop-runtime-5.0.17-win-arm64.exe"],
[".NET Core 3.0 Desktop Runtime (v3.0.3) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/e312618d-85c4-4cad-b660-569b5522eca9/e951e76ebe011b5d3ea1289ef68e8281/windowsdesktop-runtime-3.0.3-win-x86.exe"],
[".NET Core 3.0 Desktop Runtime (v3.0.3) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/c525a2bb-6e98-4e6e-849e-45241d0db71c/d21612f02b9cae52fa50eb54de905986/windowsdesktop-runtime-3.0.3-win-x64.exe"],
[".NET Core 3.1 Desktop Runtime (v3.1.28) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/d2ec7ca2-017d-4d06-a6da-3707daa3c3b1/1f2e108653e3d8316e1657105ef24b93/windowsdesktop-runtime-3.1.28-win-x86.exe"],
[".NET Core 3.1 Desktop Runtime (v3.1.28) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/5c74593e-f156-44c8-9957-f11996de72bc/d3e0e26c64a5a2d860c5c0deca975d78/windowsdesktop-runtime-3.1.28-win-x64.exe"],
[".NET 6.0 Desktop Runtime (v6.0.8) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/61747fc6-7236-4d5e-85e5-a5df5f480f3a/02203594bf1331f0875aa6491419ffa1/windowsdesktop-runtime-6.0.8-win-x86.exe"],
[".NET 6.0 Desktop Runtime (v6.0.8) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/b4a17a47-2fe8-498d-b817-30ad2e23f413/00020402af25ba40990c6cc3db5cb270/windowsdesktop-runtime-6.0.8-win-x64.exe"],
[".NET 6.0 Desktop Runtime (v6.0.8) - Windows Arm64 Installer", "https://download.visualstudio.microsoft.com/download/pr/17737b16-dbb0-45f8-9684-16cce46f0835/14475e8380422840249513d58c70d8da/windowsdesktop-runtime-6.0.8-win-arm64.exe"]
] ]
def Download(wineBotton: str, id: int, wine: str): def Download(wineBotton: str, id: int, wine: str):

View File

@ -18,6 +18,7 @@ try:
netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/vscpp/list.json").text) netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/vscpp/list.json").text)
except: except:
netList = [ netList = [
["VC6 运行库", "https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/vscpp/VC6RedistSetup_deu.exe"],
["2005 Service Pack 1 Redistributable Package MFC 安全更新", "https://download.microsoft.com/download/4/A/2/4A22001F-FA3B-4C13-BF4E-42EC249D51C4/vcredist_x86.EXE", "vcredist05_x86.exe"], ["2005 Service Pack 1 Redistributable Package MFC 安全更新", "https://download.microsoft.com/download/4/A/2/4A22001F-FA3B-4C13-BF4E-42EC249D51C4/vcredist_x86.EXE", "vcredist05_x86.exe"],
["2008 (VC++ 9.0) SP1 (不再支持) X86", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe", "vcredist08_x86.exe"], ["2008 (VC++ 9.0) SP1 (不再支持) X86", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe", "vcredist08_x86.exe"],
["2008 (VC++ 9.0) SP1 (不再支持) X64", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe", "vcredist08_x86.exe"], ["2008 (VC++ 9.0) SP1 (不再支持) X64", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe", "vcredist08_x86.exe"],

View File

@ -1,4 +1,6 @@
import os import os
import sys
import PyQt5.QtWidgets as QtWidgets
def OpenTerminal(command): def OpenTerminal(command):
if terminalEnd[terminal][1]: if terminalEnd[terminal][1]:
os.system(f"\"{terminal}\" \"{terminalEnd[terminal][0]}\" \"{command}\"") os.system(f"\"{terminal}\" \"{terminalEnd[terminal][0]}\" \"{command}\"")
@ -12,12 +14,14 @@ terminal = ""
terminalList = [ terminalList = [
"deepin-terminal", "deepin-terminal",
"mate-terminal", "mate-terminal",
"gnome-terminal" "gnome-terminal",
"xfce4-terminal"
] ]
terminalEnd = { terminalEnd = {
f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0], f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0],
"mate-terminal": ["-e", 1], "mate-terminal": ["-e", 1],
"gnome-terminal": ["--", 0] "gnome-terminal": ["--", 0],
"xfce4-terminal": ["-e", 1]
} }
for i in terminalList: for i in terminalList:
if not os.system(f"which {i}"): if not os.system(f"which {i}"):
@ -28,4 +32,6 @@ for i in terminalList:
if terminal == "": if terminal == "":
print("无法识别到以下的任意一个终端") print("无法识别到以下的任意一个终端")
print(" ".join(terminalList)) print(" ".join(terminalList))
app = QtWidgets.QApplication(sys.argv)
QtWidgets.QMessageBox.critical(None, "错误", "无法识别到以下的任意一个终端\n" + " ".join(terminalList))
exit() exit()

View File

@ -102,6 +102,17 @@ def make_deb(build=False):
if QtWidgets.QMessageBox.question(widget, QtCore.QCoreApplication.translate("U", "提示"), QtCore.QCoreApplication.translate("U", "打包将会改动现在选择的容器,是否继续?")) == QtWidgets.QMessageBox.No: if QtWidgets.QMessageBox.question(widget, QtCore.QCoreApplication.translate("U", "提示"), QtCore.QCoreApplication.translate("U", "打包将会改动现在选择的容器,是否继续?")) == QtWidgets.QMessageBox.No:
disabled_or_NORMAL_all(True) disabled_or_NORMAL_all(True)
return return
# 警告信息
if os.path.exists(e7_text.text()):
if QtWidgets.QMessageBox.warning(window, "警告", "输入的路径似乎是一个绝对路径\n不建议打包绝对路径,建议是 Wine 容器内路径\n是否继续打包?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) == QtWidgets.QMessageBox.No:
disabled_or_NORMAL_all(True)
return
if e7_text.text()[:2].lower() == "c:" and not os.path.exists("{}/drive_c/{}".format(
e6_text.text(),
e7_text.text()[3:].replace("\\", '/'))):
if QtWidgets.QMessageBox.warning(window, "警告", "输入的路径似乎在 Wine 容器不存在(如果只是大小写错误导致的误判,请忽略)\n是否继续打包?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) == QtWidgets.QMessageBox.No:
disabled_or_NORMAL_all(True)
return
#thread = threading.Thread(target=make_deb_threading) #thread = threading.Thread(target=make_deb_threading)
QT.thread = make_deb_threading(build) QT.thread = make_deb_threading(build)
QT.thread.signal.connect(chang_textbox1_things) QT.thread.signal.connect(chang_textbox1_things)

View File

@ -161,9 +161,11 @@ class Runexebutton_threading(QtCore.QThread):
option += f"WINEDLLOVERRIDES=\"mscoree,mshtml=\" " option += f"WINEDLLOVERRIDES=\"mscoree,mshtml=\" "
if not setting["Debug"]: if not setting["Debug"]:
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
else:
option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message "
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable":
os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'")
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
@ -174,8 +176,14 @@ class Runexebutton_threading(QtCore.QThread):
os.remove(f"{programPath}/dlls-arm.7z") os.remove(f"{programPath}/dlls-arm.7z")
if setting["TerminalOpen"]: if setting["TerminalOpen"]:
res = "" res = ""
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"])
else:
OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]) OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"])
#res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"] + "\" --keep-open" + wineUsingOption], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) #res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"] + "\" --keep-open" + wineUsingOption], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
else:
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
else: else:
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 实时读取程序返回 # 实时读取程序返回
@ -195,6 +203,28 @@ class Runexebutton_threading(QtCore.QThread):
wineBottonHistory.append(e2.currentText()) # 将记录写进数组 wineBottonHistory.append(e2.currentText()) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入 write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入
self.showHistory.emit("") self.showHistory.emit("")
# 针对 QQ、TIM 安装后不会生成 lnk 的问题,由程序读取以及自动创建
# 判断是否安装了 QQ/TIM
for i in iconListUnBuild:
if os.path.exists(i[1].replace("wineBottonPath", wineBottonPath)):
if not os.path.exists(f"{get_home()}/.local/share/applications/wine/{i[0]}-{os.path.basename(wineBottonPath)}.desktop"):
print("图标不存在,创建图标")
# 图标不存在
# 写入 .desktop 文件
try:
os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'")
name = i[0]
if setting["BuildByBottleName"]:
name = f"{i[0]}——{os.path.basename(wineBottonPath)}"
write_txt(f"{get_home()}/.local/share/applications/wine/{i[0]}-{os.path.basename(wineBottonPath)}.desktop", f'''[Desktop Entry]
Name={name}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{i[1].replace("wineBottonPath", wineBottonPath)}' {setting["WineOption"]} {wineUsingOption}
Icon={programPath}/Icon/{i[0]}.svg
Type=Application
StartupNotify=true''')
except:
# 写入不进去就别写入了,当什么事情都没发生就行
traceback.print_exc()
DisableButton(False) DisableButton(False)
@ -255,6 +285,8 @@ def make_desktop_on_launcher():
option += f"WINEARCH={setting['Architecture']} " option += f"WINEARCH={setting['Architecture']} "
if not setting["Debug"]: if not setting["Debug"]:
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
else:
option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message "
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
@ -263,11 +295,24 @@ def make_desktop_on_launcher():
return return
os.remove(f"{programPath}/dlls-arm.7z") os.remove(f"{programPath}/dlls-arm.7z")
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
write_txt(get_home() + "/.local/share/applications/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] value = ""
if e2.currentText()[:2].upper() == "C:":
value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/")
print(value)
iconPaths = iconPath
for i in iconList:
listValue = i[1].replace("wineBottonPath", wineBottonPath)
if listValue == e2.currentText() or listValue == value:
# 如果路径相同,即可以用程序对应的图标
iconPaths = f"{programPath}/Icon/{i[0]}.svg"
# 读到了就不需要再读取了
break
os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'")
write_txt(get_home() + "/.local/share/applications/wine/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry]
Name={combobox1.currentText()} Name={combobox1.currentText()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
Icon={iconPath} Icon={iconPaths}
Type=Application Type=Application
StartupNotify=true''') # 写入文本文档 StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@ -304,7 +349,7 @@ def make_desktop_on_desktop():
wineBottonPath = e1.currentText() wineBottonPath = e1.currentText()
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -319,10 +364,23 @@ def make_desktop_on_desktop():
option += f"WINEARCH={setting['Architecture']} " option += f"WINEARCH={setting['Architecture']} "
if not setting["Debug"]: if not setting["Debug"]:
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
value = ""
if e2.currentText()[:2].upper() == "C:":
value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/")
print(value)
iconPaths = iconPath
for i in iconList:
listValue = i[1].replace("wineBottonPath", wineBottonPath)
if listValue == e2.currentText() or listValue == value:
# 如果路径相同,即可以用程序对应的图标
iconPaths = f"{programPath}/Icon/{i[0]}.svg"
# 读到了就不需要再读取了
break
os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'")
write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry]
Name={combobox1.currentText()} Name={combobox1.currentText()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
Icon={iconPath} Icon={iconPaths}
Type=Application Type=Application
StartupNotify=true''') # 写入文本文档 StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@ -418,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread):
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable":
os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'")
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -482,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread):
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -504,6 +562,8 @@ class RunWinetricksThread(QtCore.QThread):
text = "" text = ""
self.signal.emit(text) self.signal.emit(text)
print(text, end="") print(text, end="")
DisableButton(False) DisableButton(False)
runWinetricks = None runWinetricks = None
@ -808,6 +868,7 @@ class GetDllFromWindowsISO:
mount = False mount = False
mountButton = None mountButton = None
dllListModel = None dllListModel = None
arch = 0
def ShowWindow(): def ShowWindow():
#DisableButton(True) #DisableButton(True)
GetDllFromWindowsISO.message = QtWidgets.QMainWindow() GetDllFromWindowsISO.message = QtWidgets.QMainWindow()
@ -816,8 +877,8 @@ class GetDllFromWindowsISO:
if not e1.currentText() == "": if not e1.currentText() == "":
GetDllFromWindowsISO.wineBottonPath = e1.currentText() GetDllFromWindowsISO.wineBottonPath = e1.currentText()
widgetLayout.addWidget(QtWidgets.QLabel(f"""提示: widgetLayout.addWidget(QtWidgets.QLabel(f"""提示:
目前本提取功能只支持 Windows XP 以及 Windows Server 2003 等老系统的官方安装镜像,只支持读取 i386 安装方法的安装镜像,不支持读取 wim、ghost 安装方式 目前本提取功能暂只支持 NT 内核系统的官方安装镜像,不支持读取 ghost 等第三方封装方式的安装镜像
以及不要拷贝/替换太多的 dll否则可能会导致 wine 容器异常 以及不要拷贝/替换太多的 dll否则可能会导致 wine 容器异常,以及不要替换 Wine 的核心 dll
最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置 最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置
当前选择的 Wine 容器:{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5) 当前选择的 Wine 容器:{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5)
isoLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "ISO镜像")) isoLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "ISO镜像"))
@ -903,14 +964,36 @@ class GetDllFromWindowsISO:
findList = [] findList = []
try: try:
if found == "": if found == "":
# 显示所有内容
# 下面内容需要分类讨论
if GetDllFromWindowsISO.arch == 0:
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if i[-3:] == "dl_": if i[-3:] == "dl_":
findList.append(i[:-1] + "l") findList.append(i[:-1] + "l")
elif GetDllFromWindowsISO.arch == 32:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"):
if i[-3:] == "dll":
findList.append(i[:-1] + "l")
elif GetDllFromWindowsISO.arch == 64:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"):
if i[-3:] == "dll":
findList.append(i[:-1] + "l")
GetDllFromWindowsISO.dllListModel.setStringList(findList)
return return
if GetDllFromWindowsISO.arch == 0:
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if found in i[:-1] + "l": if found in i[:-1] + "l":
findList.append(i[:-1] + "l") findList.append(i[:-1] + "l")
if len(isoPath) == 0 or isoPathFound[-1] != found: elif GetDllFromWindowsISO.arch == 32:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"):
if found in i[:-1] + "l":
findList.append(i[:-1] + "l")
elif GetDllFromWindowsISO.arch == 64:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"):
if found in i[:-1] + "l":
findList.append(i[:-1] + "l")
if len(isoPath) == 0:
if isoPathFound[-1] != found:
isoPathFound.append(found) # 将记录写进数组 isoPathFound.append(found) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入 write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入
GetDllFromWindowsISO.dllFound.clear() GetDllFromWindowsISO.dllFound.clear()
@ -928,11 +1011,15 @@ class GetDllFromWindowsISO:
if os.path.exists("/tmp/wine-runner-getdll"): if os.path.exists("/tmp/wine-runner-getdll"):
try: try:
os.rmdir("/tmp/wine-runner-getdll") os.rmdir("/tmp/wine-runner-getdll")
os.rmdir("/tmp/wine-runner-getdll-wim")
except: except:
# 如果无法删除可能是挂载了文件 # 如果无法删除可能是挂载了文件
os.system("wimunmount /tmp/wine-runner-getdll-wim")
os.system("pkexec umount /tmp/wine-runner-getdll") os.system("pkexec umount /tmp/wine-runner-getdll")
try: try:
os.rmdir("/tmp/wine-runner-getdll") os.rmdir("/tmp/wine-runner-getdll")
os.rmdir("/tmp/wine-runner-getdll-wim")
except: except:
traceback.print_exc() traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc()) QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
@ -940,10 +1027,55 @@ class GetDllFromWindowsISO:
os.makedirs("/tmp/wine-runner-getdll") os.makedirs("/tmp/wine-runner-getdll")
os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.currentText()}' /tmp/wine-runner-getdll") os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.currentText()}' /tmp/wine-runner-getdll")
findList = [] findList = []
# 判断是新版的 Windows ISOWindows Vista 及以上版本)
if os.path.exists("/tmp/wine-runner-getdll/sources/install.wim"):
# 是新版,挂载 wim
# 需要让用户选择挂载内容
QtWidgets.QInputDialog.getMultiLineText(GetDllFromWindowsISO.message, "提示", "挂载文件需要用户记住并在下一个对话框输入 Index 以挂载正确的镜像,按下下方任意按钮即可继续", subprocess.getoutput("wiminfo '/tmp/wine-runner-getdll/sources/install.wim'"))
choose = QtWidgets.QInputDialog.getInt(GetDllFromWindowsISO.message, "提示", "请输入 Index")
if not choose[1]:
return
os.makedirs("/tmp/wine-runner-getdll-wim")
os.system(f"wimmount /tmp/wine-runner-getdll/sources/install.wim {choose[0]} /tmp/wine-runner-getdll-wim")
if os.path.exists("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"):
# 如果是 64 位镜像
if QtWidgets.QInputDialog.getItem(GetDllFromWindowsISO.message, "选择位数", "选择位数(如果没有选择,默认为 64 位)", ["32", "64"], 1, False) == "32":
# 64 位镜像的 32 位是存在 SysWOW64 的
try:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"):
if i[-3:] == "dll":
findList.append(i[:-1] + "l")
GetDllFromWindowsISO.dllListModel.setStringList(findList)
GetDllFromWindowsISO.arch = 32
GetDllFromWindowsISO.DisbledDown(False)
GetDllFromWindowsISO.DisbledUp(True)
GetDllFromWindowsISO.mount = True
if len(isoPath) == 0 or isoPath[-1] != GetDllFromWindowsISO.isoPath.currentText():
isoPath.append(GetDllFromWindowsISO.isoPath.currentText()) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", str(json.dumps(ListToDictionary(isoPath)))) # 将历史记录的数组转换为字典并写入
GetDllFromWindowsISO.isoPath.clear()
GetDllFromWindowsISO.isoPath.addItems(isoPath)
return
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
return
try:
for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"):
if i[-3:] == "dll":
findList.append(i[:-1] + "l")
GetDllFromWindowsISO.arch = 64
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
return
GetDllFromWindowsISO.dllListModel.setStringList(findList)
else:
try: try:
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if i[-3:] == "dl_": if i[-3:] == "dl_":
findList.append(i[:-1] + "l") findList.append(i[:-1] + "l")
GetDllFromWindowsISO.arch = 0
except: except:
traceback.print_exc() traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
@ -960,9 +1092,11 @@ class GetDllFromWindowsISO:
#GetDllFromWindowsISO.isoPath['value'] = isoPath #GetDllFromWindowsISO.isoPath['value'] = isoPath
def UmountDisk(): def UmountDisk():
os.system("wimunmount /tmp/wine-runner-getdll-wim")
os.system("pkexec umount /tmp/wine-runner-getdll") os.system("pkexec umount /tmp/wine-runner-getdll")
try: try:
shutil.rmtree("/tmp/wine-runner-getdll") shutil.rmtree("/tmp/wine-runner-getdll")
os.system("rm -rf /tmp/wine-runner-getdll-wim")
except: except:
traceback.print_exc() traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "错误"), f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}") QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "错误"), f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}")
@ -975,10 +1109,22 @@ class GetDllFromWindowsISO:
def CopyDll(): def CopyDll():
choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data() choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data()
if os.path.exists(f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}"): if os.path.exists(f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}"):
if QtWidgets.QMessageBox.question(widget, "提示", f"DLL {choose} 已经存在,是否覆盖?") == QtWidgets.QMessageBox.No: if QtWidgets.QMessageBox.question(GetDllFromWindowsISO.message, "提示", f"DLL {choose} 已经存在,是否覆盖?") == QtWidgets.QMessageBox.No:
return return
try: try:
# 要分类讨论
if GetDllFromWindowsISO.arch == 0:
shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}")
elif GetDllFromWindowsISO.arch == 32:
shutil.copy(f"/tmp/wine-runner-getdll-wim/Windows/SysWOW64/{choose[:-1]}l", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}")
elif GetDllFromWindowsISO.arch == 64:
shutil.copy(f"/tmp/wine-runner-getdll-wim/Windows/System32/{choose[:-1]}l", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}")
# 选择原装或优于内建
if QtWidgets.QInputDialog.getItem(GetDllFromWindowsISO.message, "选择", "选择模式", ["原装先于内建", "原装"], 0, False) == "原装先于内建":
# 原装先于内建
os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native,builtin /f")
else:
# 原装
os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native /f") os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native /f")
QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "提取成功!") QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "提取成功!")
except: except:
@ -1111,13 +1257,14 @@ class ProgramRunStatusUpload():
try: try:
if ProgramRunStatusUpload.sha1Value == "": if ProgramRunStatusUpload.sha1Value == "":
ProgramRunStatusUpload.sha1Value = ProgramRunStatusUpload.GetSHA1(e2.currentText()) ProgramRunStatusUpload.sha1Value = ProgramRunStatusUpload.GetSHA1(e2.currentText())
QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), json.loads(requests.post(base64.b64decode("aHR0cDovL2dmZGdkeGkucWljcC52aXA6Mjc1MDI=").decode("utf-8"), { QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), json.loads(requests.post(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0OjMwMjUw").decode("utf-8"), {
"SHA1": ProgramRunStatusUpload.sha1Value, "SHA1": ProgramRunStatusUpload.sha1Value,
"Name": ProgramRunStatusUpload.programName.text(), "Name": ProgramRunStatusUpload.programName.text(),
"Fen": ProgramRunStatusUpload.fen.currentIndex(), "Fen": ProgramRunStatusUpload.fen.currentIndex(),
"Wine": o1.currentText() "Wine": o1.currentText()
}).text)["Error"]) }).text)["Error"])
except: except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!")) QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!"))
def GetSHA1(filePath): def GetSHA1(filePath):
@ -1145,6 +1292,7 @@ class ProgramSetting():
monogeckoInstaller = None monogeckoInstaller = None
autoWine = None autoWine = None
runtimeCache = None runtimeCache = None
buildByBottleName = None
def ShowWindow(): def ShowWindow():
ProgramSetting.message = QtWidgets.QMainWindow() ProgramSetting.message = QtWidgets.QMainWindow()
widget = QtWidgets.QWidget() widget = QtWidgets.QWidget()
@ -1159,6 +1307,7 @@ class ProgramSetting():
widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "Wine 默认 Mono 和 Gecko 安装器:")), 7, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "Wine 默认 Mono 和 Gecko 安装器:")), 7, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "忽略未安装的 Wine")), 8, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "忽略未安装的 Wine")), 8, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "下载缓存:")), 9, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "下载缓存:")), 9, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "图标生成:")), 10, 0, 1, 1)
ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineBottonA = QtWidgets.QComboBox()
ProgramSetting.wineDebug = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启 DEBUG 输出")) ProgramSetting.wineDebug = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启 DEBUG 输出"))
ProgramSetting.defultWine = QtWidgets.QComboBox() ProgramSetting.defultWine = QtWidgets.QComboBox()
@ -1177,6 +1326,7 @@ class ProgramSetting():
ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "屏蔽 Wine 默认 Mono 和 Gecko 安装器")) ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "屏蔽 Wine 默认 Mono 和 Gecko 安装器"))
ProgramSetting.autoWine = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "不显示未检测到的 Wine")) ProgramSetting.autoWine = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "不显示未检测到的 Wine"))
ProgramSetting.runtimeCache = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启下载缓存")) ProgramSetting.runtimeCache = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启下载缓存"))
ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "本软件构建的图标后面添加容器名"))
ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"])
ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"]) ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"])
ProgramSetting.wineDebug.setChecked(setting["Debug"]) ProgramSetting.wineDebug.setChecked(setting["Debug"])
@ -1188,6 +1338,7 @@ class ProgramSetting():
ProgramSetting.monogeckoInstaller.setChecked(setting["MonoGeckoInstaller"]) ProgramSetting.monogeckoInstaller.setChecked(setting["MonoGeckoInstaller"])
ProgramSetting.autoWine.setChecked(setting["AutoWine"]) ProgramSetting.autoWine.setChecked(setting["AutoWine"])
ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"]) ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"])
ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"])
widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.defultWine, 2, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.defultWine, 2, 1, 1, 1)
@ -1200,7 +1351,8 @@ class ProgramSetting():
widgetLayout.addWidget(ProgramSetting.monogeckoInstaller, 7, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.monogeckoInstaller, 7, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.autoWine, 8, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.autoWine, 8, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.runtimeCache, 9, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.runtimeCache, 9, 1, 1, 1)
widgetLayout.addWidget(save, 10, 2, 1, 1) widgetLayout.addWidget(ProgramSetting.buildByBottleName, 10, 1, 1, 1)
widgetLayout.addWidget(save, 11, 2, 1, 1)
widget.setLayout(widgetLayout) widget.setLayout(widgetLayout)
ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setCentralWidget(widget)
ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath)) ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath))
@ -1228,6 +1380,7 @@ class ProgramSetting():
setting["MonoGeckoInstaller"] = ProgramSetting.monogeckoInstaller.isChecked() setting["MonoGeckoInstaller"] = ProgramSetting.monogeckoInstaller.isChecked()
setting["AutoWine"] = ProgramSetting.autoWine.isChecked() setting["AutoWine"] = ProgramSetting.autoWine.isChecked()
setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked() setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked()
setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked()
try: try:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
except: except:
@ -1236,7 +1389,103 @@ class ProgramSetting():
return return
QtWidgets.QMessageBox.information(ProgramSetting.message, "提示", "保存完毕!") QtWidgets.QMessageBox.information(ProgramSetting.message, "提示", "保存完毕!")
class ValueCheck():
def __init__(self):
pass
def BASE64(self, filePath):
src = ""
with open(filePath, "rb") as f:
base64Byte = base64.b64encode(f.read())
src += base64Byte.decode("utf-8")
return src
def SHA1(self, filePath):
sha1 = hashlib.sha1()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
sha1.update(readByte)
if not readByte:
break
file.close()
return sha1.hexdigest()
def MD5(self, filePath):
md5 = hashlib.md5()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
md5.update(readByte)
if not readByte:
break
file.close()
return md5.hexdigest()
def SHA256(self, filePath):
value = hashlib.sha256()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
value.update(readByte)
if not readByte:
break
file.close()
return value.hexdigest()
def SHA384(self, filePath):
value = hashlib.sha384()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
value.update(readByte)
if not readByte:
break
file.close()
return value.hexdigest()
def SHA224(self, filePath):
value = hashlib.sha224()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
value.update(readByte)
if not readByte:
break
file.close()
return value.hexdigest()
def SHA512(self, filePath):
value = hashlib.sha512()
file = open(filePath, "rb")
while True:
readByte = file.read(1024 * 1024)
value.update(readByte)
if not readByte:
break
file.close()
return value.hexdigest()
link = {
"SHA1": SHA1,
"MD5": MD5,
"SHA256": SHA256,
"SHA512": SHA512,
"SHA224": SHA224,
"SHA384": SHA384,
"BASE64": BASE64
}
def Get(self, types):
QtWidgets.QMessageBox.information(window, "提示", "在计算过程中,程序可能会出现无响应的问题,请稍后\n请在接下来的打开对话框中选择要计算的文件")
file = QtWidgets.QFileDialog.getOpenFileName(window, "打开")[0]
if file == "":
return
try:
QtWidgets.QInputDialog.getMultiLineText(window, "值", "计算得到的值", self.link[types](self, file))
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(window, "错误", traceback.format_exc())
########################### ###########################
# 加载配置 # 加载配置
@ -1254,7 +1503,8 @@ defultProgramList = {
"MonoGeckoInstaller": True, "MonoGeckoInstaller": True,
"AutoWine": True, "AutoWine": True,
"RuntimeCache": True, "RuntimeCache": True,
"MustRead": False "MustRead": False,
"BuildByBottleName": False
} }
if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹
@ -1285,7 +1535,7 @@ programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
try: try:
wine = { wine = {
"基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ", "基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ",
"基于 exagear 的 deepin-wine6-stable": f"/opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", "基于 exagear 的 deepin-wine6-stable": f"WINEDLLPATH=/opt/deepin-wine6-stable/lib /opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ",
"deepin-wine6 stable": "deepin-wine6-stable", "deepin-wine6 stable": "deepin-wine6-stable",
"deepin-wine5 stable": "deepin-wine5-stable", "deepin-wine5 stable": "deepin-wine5-stable",
"spark-wine7-devel": "spark-wine7-devel", "spark-wine7-devel": "spark-wine7-devel",
@ -1388,30 +1638,23 @@ exe路径\' 参数 \'
<b>千万不要中断后不删除源的情况下 apt upgrade </b>中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine会自动执行恢复操作即可 <b>千万不要中断后不删除源的情况下 apt upgrade </b>中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine会自动执行恢复操作即可
以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示 以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示
<code>N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。</code>''' <code>N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。</code>'''
updateThingsString = '''<h3>2.1.0-2 更新内容:</h3> updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的 Dll 提取并优化了提示文本
※1、修复终端调用问题 ※2、支持卸载后自动删除缓存/配置文件(删除配置文件只限 purge 参数删除)
<h3>2.1.0-1 更新内容:</h3> ※3、DEBUG 模式输出更多信息以方便调试(原本只输出 pid、Err
※1、删除多余图标 ※4、支持安装 msi 文件
※2、修复将打包文件生成目录设置为 / 等重要目录导致删库的问题 ※5、修复无法正常评分的问题
3、修复了打包器浏览按钮闪退、生成的 postrm 有误的问题 ※6、修复 QQ、TIM 安装后无法正常生成快捷方式的问题
4、支持在输入信息时自动生成 deb 保存路径 ※7、基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本
<h3>2.1.0 更新内容:</h3> 8、更新组件安装的离线列表
<b>※1、新增新的 Wine 安装器,并支持将安装的 Wine 打包到 Wine 程序 deb 包中 9、不再强制依赖深度终端只做推荐安装
※2、Wine 打包器打包 Windows 应用支持将 Wine 打包入 deb 内,可以不依赖 Wine一般不推荐把 Wine 打包入内,推荐用依赖的形式),并支持设置自定义依赖和生成模板 <b>以下更新内容旧版本也适用(只限 2.1.0 及以上版本)</b>
※3、开始初步多语言支持 ※1、在“安装更多Wine”的Wine安装工具中上 wine-staging 7.17、wine-staging 6.7、spark-wine7-devel 7.17
※4、修复了在没有安装任何 Wine 的情况下使用高级功能导致程序闪退的问题 ※2、云 Dll 工具上新 Dll
※5、支持云端自动获取数据配置 Wine 容器 ※3、VCPP 运行库安装工具新增 VC6 运行库
※6、支持手动导入配置文件自动配置 Wine 容器
※7、新增从云端下载 Dll 的功能
※8、修复了 Dll 提取工具不会在 winecfg 中添加原装的问题</b>
9、修改错别字图形话=>图形化)
10、修复评分功能名称为空也可以上传评分的问题
11、去除 toilet 依赖,使在 Deepin 23 Preview 上运行更佳
12、支持删除所有由 Wine 创建的启动器快捷方式
''' '''
for i in information["Thank"]: for i in information["Thank"]:
thankText += f"{i}\n" thankText += f"{i}\n"
updateTime = "2022年09月03日" updateTime = "2022年09月11日"
about = f'''<h1>关于</h1> about = f'''<h1>关于</h1>
<p>一个能让Linux用户更加方便运行Windows应用的程序内置了对wine图形化的支持和各种Wine工具和自制Wine程序打包器、运行库安装工具等等</p> <p>一个能让Linux用户更加方便运行Windows应用的程序内置了对wine图形化的支持和各种Wine工具和自制Wine程序打包器、运行库安装工具等等</p>
<p>同时也内置了基于VirtualBox制作的小白Windows虚拟机安装工具可以做到只需要用户下载系统镜像并点击安装即可无需顾及虚拟机安装、创建、虚拟机的分区等等</p> <p>同时也内置了基于VirtualBox制作的小白Windows虚拟机安装工具可以做到只需要用户下载系统镜像并点击安装即可无需顾及虚拟机安装、创建、虚拟机的分区等等</p>
@ -1445,8 +1688,21 @@ try:
threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL29wZW4vSW5zdGFsbC5waHA=").decode("utf-8")) + "?Version=" + version]).start() threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL29wZW4vSW5zdGFsbC5waHA=").decode("utf-8")) + "?Version=" + version]).start()
except: except:
pass pass
iconListUnBuild = [
["QQ", "wineBottonPath/drive_c/Program Files/Tencent/QQ/Bin/QQ.exe"],
["QQ", "wineBottonPath/drive_c/Program Files (x86)/Tencent/QQ/Bin/QQ.exe"],
["TIM", "wineBottonPath/drive_c/Program Files/Tencent/TIM/Bin/TIM.exe"],
["TIM", "wineBottonPath/drive_c/Program Files (x86)/Tencent/TIM/Bin/TIM.exe"]
]
iconList = [
["微信", "wineBottonPath/drive_c/Program Files/Tencent/WeChat/WeChat.exe"],
["微信", "wineBottonPath/drive_c/Program Files (x86)/Tencent/WeChat/WeChat.exe"],
["UltraISO", "wineBottonPath/drive_c/Program Files/UltraISO/UltraISO.exe"],
["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"]
]
for i in iconListUnBuild:
iconList.append(i)
print(iconList)
########################### ###########################
# 窗口创建 # 窗口创建
@ -1526,7 +1782,7 @@ programManager = QtWidgets.QGridLayout()
leftDownLayout.addLayout(programManager) leftDownLayout.addLayout(programManager)
programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1)
getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标")) getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标"))
getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' '{e2.currentText()}" if e2.currentText()[:2].upper() == "C:" else f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}"))
programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(getProgramIcon, 1, 0, 1, 1)
programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1)
trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具"))
@ -1643,7 +1899,7 @@ cleanBottonUOS = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "清
w5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打包 wine 应用")) w5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打包 wine 应用"))
w6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用官方 Wine 适配活动的脚本进行打包")) w6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用官方 Wine 适配活动的脚本进行打包"))
getDllOnInternet = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从互联网获取DLL")) getDllOnInternet = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从互联网获取DLL"))
w7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从镜像获取DLL只支持Windows XP、Windows Server 2003官方安装镜像")) w7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从镜像获取DLL只支持官方安装镜像DOS内核如 Windows 95 暂不支持"))
updateGeek = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从 Geek Uninstaller 官网升级程序")) updateGeek = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从 Geek Uninstaller 官网升级程序"))
deleteDesktopIcon = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除所有 Wine 程序在启动器的快捷方式")) deleteDesktopIcon = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除所有 Wine 程序在启动器的快捷方式"))
wineOption.addAction(w1) wineOption.addAction(w1)
@ -1753,6 +2009,24 @@ v1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用 Virtualbox
virtualMachine.addAction(v1) virtualMachine.addAction(v1)
v1.triggered.connect(RunVM) v1.triggered.connect(RunVM)
checkValue = menu.addMenu(QtCore.QCoreApplication.translate("U", "校验值计算(&S)"))
md5Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "MD5(&M)"))
sha1Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA1(&M)"))
base64Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "Base64(建议小文件)(&B)"))
sha256Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA256(&S)"))
sha512Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA512(&S)"))
md5Value.triggered.connect(lambda: ValueCheck().Get("MD5"))
sha1Value.triggered.connect(lambda: ValueCheck().Get("SHA1"))
base64Value.triggered.connect(lambda: ValueCheck().Get("BASE64"))
sha256Value.triggered.connect(lambda: ValueCheck().Get("SHA256"))
sha512Value.triggered.connect(lambda: ValueCheck().Get("SHA512"))
checkValue.addAction(md5Value)
checkValue.addAction(sha1Value)
checkValue.addAction(base64Value)
checkValue.addAction(sha256Value)
checkValue.addAction(sha512Value)
safeWebsize = menu.addMenu(QtCore.QCoreApplication.translate("U", "云沙箱(&C)")) safeWebsize = menu.addMenu(QtCore.QCoreApplication.translate("U", "云沙箱(&C)"))
s1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "360 沙箱云")) s1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "360 沙箱云"))
s2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "微步云沙箱")) s2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "微步云沙箱"))
@ -1876,4 +2150,6 @@ if o1.currentText() == "":
wine["没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用"] = "没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用" wine["没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用"] = "没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用"
canUseWine.append("没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用") canUseWine.append("没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用")
o1.addItem("没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用") o1.addItem("没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用")
sys.exit(app.exec_()) sys.exit(app.exec_())

View File

@ -1,5 +1,5 @@
{ {
"Version": "2.1.0-2", "Version": "2.2.0-Alpha2",
"Thank": [ "Thank": [
"感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301",
"感谢 @zhangs https://bbs.deepin.org/post/227948", "感谢 @zhangs https://bbs.deepin.org/post/227948",
@ -22,6 +22,7 @@
"感谢 @五行缺钱 反馈的 2.0.0 在 Deepin 23 缺失依赖 toilet 的问题", "感谢 @五行缺钱 反馈的 2.0.0 在 Deepin 23 缺失依赖 toilet 的问题",
"感谢 @云的眼泪 @zhengjl 反馈的 2.0.0 发布忘记把安装包传蓝奏云的问题", "感谢 @云的眼泪 @zhengjl 反馈的 2.0.0 发布忘记把安装包传蓝奏云的问题",
"感谢 @虚幻的早晨 提出的添加 DXVK、VKD3D 的功能VKD3D 暂未实现)", "感谢 @虚幻的早晨 提出的添加 DXVK、VKD3D 的功能VKD3D 暂未实现)",
"感谢 @以勒 修改 Dll 提取工具提示文本的建议",
"感谢统信在 Wine 生态适配活动中提供的打包脚本", "感谢统信在 Wine 生态适配活动中提供的打包脚本",
"也感谢 DXVK 的开发者开发了 DXVK 这个程序项目链接https://github.com/doitsujin/dxvk", "也感谢 DXVK 的开发者开发了 DXVK 这个程序项目链接https://github.com/doitsujin/dxvk",
"也感谢 WineHQ 开发团队开发的 WineHQ项目网址https://dl.winehq.org/", "也感谢 WineHQ 开发团队开发的 WineHQ项目网址https://dl.winehq.org/",

View File

@ -1,5 +1,5 @@
{ {
"Version": "2.2.0", "Version": "2.2.0-Alpha2",
"Thank": [ "Thank": [
"感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301",
"感谢 @zhangs https://bbs.deepin.org/post/227948", "感谢 @zhangs https://bbs.deepin.org/post/227948",

View File

@ -165,7 +165,7 @@ class Runexebutton_threading(QtCore.QThread):
option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message " option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message "
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable":
os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'")
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
@ -295,18 +295,24 @@ def make_desktop_on_launcher():
return return
os.remove(f"{programPath}/dlls-arm.7z") os.remove(f"{programPath}/dlls-arm.7z")
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
value = ""
if e2.currentText()[:2].upper() == "C:":
value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/")
print(value)
iconPaths = iconPath
for i in iconList: for i in iconList:
if i[1].replace("wineBottonPath", wineBottonPath) == e2.currentText(): listValue = i[1].replace("wineBottonPath", wineBottonPath)
if listValue == e2.currentText() or listValue == value:
# 如果路径相同,即可以用程序对应的图标 # 如果路径相同,即可以用程序对应的图标
iconPath = f"{programPath}/Icon/{i[0]}.svg" iconPaths = f"{programPath}/Icon/{i[0]}.svg"
# 读到了就不需要再读取了 # 读到了就不需要再读取了
break break
os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'")
write_txt(get_home() + "/.local/share/applications/wine/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] write_txt(get_home() + "/.local/share/applications/wine/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry]
Name={combobox1.currentText()} Name={combobox1.currentText()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
Icon={iconPath} Icon={iconPaths}
Type=Application Type=Application
StartupNotify=true''') # 写入文本文档 StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@ -343,7 +349,7 @@ def make_desktop_on_desktop():
wineBottonPath = e1.currentText() wineBottonPath = e1.currentText()
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -358,17 +364,23 @@ def make_desktop_on_desktop():
option += f"WINEARCH={setting['Architecture']} " option += f"WINEARCH={setting['Architecture']} "
if not setting["Debug"]: if not setting["Debug"]:
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
value = ""
if e2.currentText()[:2].upper() == "C:":
value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/")
print(value)
iconPaths = iconPath
for i in iconList: for i in iconList:
if i[1].replace("wineBottonPath", wineBottonPath) == e2.currentText(): listValue = i[1].replace("wineBottonPath", wineBottonPath)
if listValue == e2.currentText() or listValue == value:
# 如果路径相同,即可以用程序对应的图标 # 如果路径相同,即可以用程序对应的图标
iconPath = f"{programPath}/Icon/{i[0]}.svg" iconPaths = f"{programPath}/Icon/{i[0]}.svg"
# 读到了就不需要再读取了 # 读到了就不需要再读取了
break break
os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'")
write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry]
Name={combobox1.currentText()} Name={combobox1.currentText()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
Icon={iconPath} Icon={iconPaths}
Type=Application Type=Application
StartupNotify=true''') # 写入文本文档 StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@ -464,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread):
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable":
os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'")
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -528,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread):
option += "WINEDEBUG=-all " option += "WINEDEBUG=-all "
wineUsingOption = "" wineUsingOption = ""
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
wineUsingOption = "--disable-gpu" wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"): if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@ -1523,7 +1535,7 @@ programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
try: try:
wine = { wine = {
"基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ", "基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ",
"基于 exagear 的 deepin-wine6-stable": f"/opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", "基于 exagear 的 deepin-wine6-stable": f"WINEDLLPATH=/opt/deepin-wine6-stable/lib /opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ",
"deepin-wine6 stable": "deepin-wine6-stable", "deepin-wine6 stable": "deepin-wine6-stable",
"deepin-wine5 stable": "deepin-wine5-stable", "deepin-wine5 stable": "deepin-wine5-stable",
"spark-wine7-devel": "spark-wine7-devel", "spark-wine7-devel": "spark-wine7-devel",
@ -1635,6 +1647,10 @@ updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的
7基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本 7基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本
8更新组件安装的离线列表 8更新组件安装的离线列表
9不再强制依赖深度终端只做推荐安装 9不再强制依赖深度终端只做推荐安装
<b>以下更新内容旧版本也适用只限 2.1.0 及以上版本</b>
1安装更多Wine的Wine安装工具中上 wine-staging 7.17wine-staging 6.7spark-wine7-devel 7.17
2 Dll 工具上新 Dll
3VCPP 运行库安装工具新增 VC6 运行库
''' '''
for i in information["Thank"]: for i in information["Thank"]:
thankText += f"{i}\n" thankText += f"{i}\n"
@ -1682,7 +1698,11 @@ iconList = [
["微信", "wineBottonPath/drive_c/Program Files/Tencent/WeChat/WeChat.exe"], ["微信", "wineBottonPath/drive_c/Program Files/Tencent/WeChat/WeChat.exe"],
["微信", "wineBottonPath/drive_c/Program Files (x86)/Tencent/WeChat/WeChat.exe"], ["微信", "wineBottonPath/drive_c/Program Files (x86)/Tencent/WeChat/WeChat.exe"],
["UltraISO", "wineBottonPath/drive_c/Program Files/UltraISO/UltraISO.exe"], ["UltraISO", "wineBottonPath/drive_c/Program Files/UltraISO/UltraISO.exe"],
["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"] ["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"],
["迅雷", "wineBottonPath/drive_c/Program Files/Thunder Network/MiniThunder/Bin/ThunderMini.exe"],
["迅雷", "wineBottonPath/drive_c/Program Files (x86)/Thunder Network/MiniThunder/Bin/ThunderMini.exe"],
["Microsoft Office Word", "wineBottonPath/drive_c/Program Files/Microsoft Office/Office12/WINWORD.EXE"],
["Microsoft Office Word", "wineBottonPath/drive_c/Program Files (x86)/Microsoft Office/Office12/WINWORD.EXE"]
] ]
for i in iconListUnBuild: for i in iconListUnBuild:
iconList.append(i) iconList.append(i)
@ -1766,7 +1786,7 @@ programManager = QtWidgets.QGridLayout()
leftDownLayout.addLayout(programManager) leftDownLayout.addLayout(programManager)
programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1)
getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标")) getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标"))
getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' '{e2.currentText()}" if e2.currentText()[:2].upper() == "C:" else f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}"))
programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(getProgramIcon, 1, 0, 1, 1)
programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1)
trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具"))

Binary file not shown.

View File

@ -1,3 +1,3 @@
{ {
"Version": "2.2.0" "Version": "2.2.0-2"
} }