diff --git a/Icon/Microsoft Office Word.svg b/Icon/Microsoft Office Word.svg
new file mode 100644
index 0000000..cd518d4
--- /dev/null
+++ b/Icon/Microsoft Office Word.svg
@@ -0,0 +1,267 @@
+
+
+
+
diff --git a/Icon/Unknown.svg b/Icon/Unknown.svg
new file mode 100644
index 0000000..96dbeed
--- /dev/null
+++ b/Icon/Unknown.svg
@@ -0,0 +1,328 @@
+
+
+
+
diff --git a/Icon/迅雷.svg b/Icon/迅雷.svg
new file mode 100644
index 0000000..9f89815
--- /dev/null
+++ b/Icon/迅雷.svg
@@ -0,0 +1,267 @@
+
+
+
+
diff --git a/buildshell/main.py b/buildshell/main.py
new file mode 100644
index 0000000..39defad
--- /dev/null
+++ b/buildshell/main.py
@@ -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
+# 差异对比
\ No newline at end of file
diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control
index e365e58..18843c7 100755
--- a/deb/DEBIAN/control
+++ b/deb/DEBIAN/control
@@ -1,5 +1,5 @@
Package: spark-deepin-wine-runner
-Version: 2.2.0
+Version: 2.2.0-Alpha2
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
Architecture: all
@@ -9,7 +9,7 @@ Recommends: winbind
Section: utils
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
-Installed-Size: 24948
+Installed-Size: 25152
Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器
2.1.0-1 更新内容:
※1、删除多余图标
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg b/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg
new file mode 100644
index 0000000..2b858d4
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg
@@ -0,0 +1,342 @@
+
+
+
+
\ No newline at end of file
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg b/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg
new file mode 100644
index 0000000..df383e4
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg
@@ -0,0 +1,289 @@
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg b/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg
new file mode 100644
index 0000000..868d740
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg
@@ -0,0 +1,1275 @@
+
+
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg b/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg
new file mode 100644
index 0000000..96dbeed
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg
@@ -0,0 +1,328 @@
+
+
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/微信.svg b/deb/opt/apps/deepin-wine-runner/Icon/微信.svg
new file mode 100644
index 0000000..bab296b
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/微信.svg
@@ -0,0 +1,338 @@
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py b/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py
index 8a29b65..f4a9a8b 100755
--- a/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py
+++ b/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py
@@ -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)
except:
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"],
["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"],
@@ -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.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.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):
diff --git a/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py b/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py
index ace14b6..26a136a 100755
--- a/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py
+++ b/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py
@@ -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)
except:
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"],
["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"],
diff --git a/deb/opt/apps/deepin-wine-runner/Model/__init__.py b/deb/opt/apps/deepin-wine-runner/Model/__init__.py
index 7f043be..eee72d3 100644
--- a/deb/opt/apps/deepin-wine-runner/Model/__init__.py
+++ b/deb/opt/apps/deepin-wine-runner/Model/__init__.py
@@ -1,4 +1,6 @@
import os
+import sys
+import PyQt5.QtWidgets as QtWidgets
def OpenTerminal(command):
if terminalEnd[terminal][1]:
os.system(f"\"{terminal}\" \"{terminalEnd[terminal][0]}\" \"{command}\"")
@@ -12,12 +14,14 @@ terminal = ""
terminalList = [
"deepin-terminal",
"mate-terminal",
- "gnome-terminal"
+ "gnome-terminal",
+ "xfce4-terminal"
]
terminalEnd = {
f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0],
"mate-terminal": ["-e", 1],
- "gnome-terminal": ["--", 0]
+ "gnome-terminal": ["--", 0],
+ "xfce4-terminal": ["-e", 1]
}
for i in terminalList:
if not os.system(f"which {i}"):
@@ -28,4 +32,6 @@ for i in terminalList:
if terminal == "":
print("无法识别到以下的任意一个终端")
print(" ".join(terminalList))
+ app = QtWidgets.QApplication(sys.argv)
+ QtWidgets.QMessageBox.critical(None, "错误", "无法识别到以下的任意一个终端\n" + " ".join(terminalList))
exit()
diff --git a/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc b/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc
index 3a4bb90..6766788 100644
Binary files a/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc and b/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc differ
diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
index 404ee51..0bb68d1 100755
--- a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
+++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
@@ -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:
disabled_or_NORMAL_all(True)
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)
QT.thread = make_deb_threading(build)
QT.thread.signal.connect(chang_textbox1_things)
diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
index dbf272b..713ede7 100755
--- a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
+++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
@@ -161,9 +161,11 @@ class Runexebutton_threading(QtCore.QThread):
option += f"WINEDLLOVERRIDES=\"mscoree,mshtml=\" "
if not setting["Debug"]:
option += "WINEDEBUG=-all "
+ else:
+ option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message "
wineUsingOption = ""
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":
os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'")
if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
@@ -174,10 +176,16 @@ class Runexebutton_threading(QtCore.QThread):
os.remove(f"{programPath}/dlls-arm.7z")
if setting["TerminalOpen"]:
res = ""
- OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"])
+ 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"])
#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:
- res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ 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:
+ res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 实时读取程序返回
#
if not setting["TerminalOpen"]:
@@ -195,6 +203,28 @@ class Runexebutton_threading(QtCore.QThread):
wineBottonHistory.append(e2.currentText()) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入
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)
@@ -255,6 +285,8 @@ def make_desktop_on_launcher():
option += f"WINEARCH={setting['Architecture']} "
if not setting["Debug"]:
option += "WINEDEBUG=-all "
+ else:
+ option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message "
wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"):
@@ -263,11 +295,24 @@ def make_desktop_on_launcher():
return
os.remove(f"{programPath}/dlls-arm.7z")
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable":
- wineUsingOption = "--disable-gpu"
- write_txt(get_home() + "/.local/share/applications/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry]
+ 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:
+ 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()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
-Icon={iconPath}
+Icon={iconPaths}
Type=Application
StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@@ -304,7 +349,7 @@ def make_desktop_on_desktop():
wineBottonPath = e1.currentText()
wineUsingOption = ""
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 not os.path.exists(f"{programPath}/dlls-arm"):
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']} "
if not setting["Debug"]:
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]
Name={combobox1.currentText()}
Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption}
-Icon={iconPath}
+Icon={iconPaths}
Type=Application
StartupNotify=true''') # 写入文本文档
if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText():
@@ -418,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread):
if o1.currentText() == "基于 exagear 的 deepin-wine6-stable":
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":
- wineUsingOption = "--disable-gpu"
+ wineUsingOption = ""
if o1.currentText() == "基于 box86 的 deepin-wine6-stable":
if not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@@ -482,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread):
option += "WINEDEBUG=-all "
wineUsingOption = ""
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 not os.path.exists(f"{programPath}/dlls-arm"):
if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""):
@@ -504,6 +562,8 @@ class RunWinetricksThread(QtCore.QThread):
text = ""
self.signal.emit(text)
print(text, end="")
+
+
DisableButton(False)
runWinetricks = None
@@ -808,6 +868,7 @@ class GetDllFromWindowsISO:
mount = False
mountButton = None
dllListModel = None
+ arch = 0
def ShowWindow():
#DisableButton(True)
GetDllFromWindowsISO.message = QtWidgets.QMainWindow()
@@ -816,8 +877,8 @@ class GetDllFromWindowsISO:
if not e1.currentText() == "":
GetDllFromWindowsISO.wineBottonPath = e1.currentText()
widgetLayout.addWidget(QtWidgets.QLabel(f"""提示:
- 目前本提取功能只支持 Windows XP 以及 Windows Server 2003 等老系统的官方安装镜像,只支持读取 i386 安装方法的安装镜像,不支持读取 wim、ghost 安装方式
- 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常
+ 目前本提取功能暂只支持 NT 内核系统的官方安装镜像,不支持读取 ghost 等第三方封装方式的安装镜像
+ 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常,以及不要替换 Wine 的核心 dll
最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置
当前选择的 Wine 容器:{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5)
isoLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "ISO镜像:"))
@@ -903,16 +964,38 @@ class GetDllFromWindowsISO:
findList = []
try:
if found == "":
- for i in os.listdir("/tmp/wine-runner-getdll/i386"):
- if i[-3:] == "dl_":
- findList.append(i[:-1] + "l")
+ # 显示所有内容
+ # 下面内容需要分类讨论
+ if GetDllFromWindowsISO.arch == 0:
+ for i in os.listdir("/tmp/wine-runner-getdll/i386"):
+ if i[-3:] == "dl_":
+ 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
- for i in os.listdir("/tmp/wine-runner-getdll/i386"):
- if found in i[:-1] + "l":
- findList.append(i[:-1] + "l")
- if len(isoPath) == 0 or isoPathFound[-1] != found:
- isoPathFound.append(found) # 将记录写进数组
- write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入
+ if GetDllFromWindowsISO.arch == 0:
+ for i in os.listdir("/tmp/wine-runner-getdll/i386"):
+ if found in 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 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) # 将记录写进数组
+ write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入
GetDllFromWindowsISO.dllFound.clear()
GetDllFromWindowsISO.dllFound.addItems(isoPathFound)
GetDllFromWindowsISO.dllListModel.setStringList(findList)
@@ -928,11 +1011,15 @@ class GetDllFromWindowsISO:
if os.path.exists("/tmp/wine-runner-getdll"):
try:
os.rmdir("/tmp/wine-runner-getdll")
+ os.rmdir("/tmp/wine-runner-getdll-wim")
except:
# 如果无法删除可能是挂载了文件
+ os.system("wimunmount /tmp/wine-runner-getdll-wim")
os.system("pkexec umount /tmp/wine-runner-getdll")
+
try:
os.rmdir("/tmp/wine-runner-getdll")
+ os.rmdir("/tmp/wine-runner-getdll-wim")
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
@@ -940,15 +1027,60 @@ class GetDllFromWindowsISO:
os.makedirs("/tmp/wine-runner-getdll")
os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.currentText()}' /tmp/wine-runner-getdll")
findList = []
- try:
- for i in os.listdir("/tmp/wine-runner-getdll/i386"):
- if i[-3:] == "dl_":
- findList.append(i[:-1] + "l")
- except:
- traceback.print_exc()
- QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
- return
- GetDllFromWindowsISO.dllListModel.setStringList(findList)
+ # 判断是新版的 Windows ISO(Windows 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:
+ for i in os.listdir("/tmp/wine-runner-getdll/i386"):
+ if i[-3:] == "dl_":
+ findList.append(i[:-1] + "l")
+ GetDllFromWindowsISO.arch = 0
+ except:
+ traceback.print_exc()
+ QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
+ return
+ GetDllFromWindowsISO.dllListModel.setStringList(findList)
GetDllFromWindowsISO.DisbledDown(False)
GetDllFromWindowsISO.DisbledUp(True)
GetDllFromWindowsISO.mount = True
@@ -960,9 +1092,11 @@ class GetDllFromWindowsISO:
#GetDllFromWindowsISO.isoPath['value'] = isoPath
def UmountDisk():
+ os.system("wimunmount /tmp/wine-runner-getdll-wim")
os.system("pkexec umount /tmp/wine-runner-getdll")
try:
shutil.rmtree("/tmp/wine-runner-getdll")
+ os.system("rm -rf /tmp/wine-runner-getdll-wim")
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "错误"), f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}")
@@ -975,11 +1109,23 @@ class GetDllFromWindowsISO:
def CopyDll():
choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data()
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
try:
- shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}")
- 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")
+ # 要分类讨论
+ if GetDllFromWindowsISO.arch == 0:
+ 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")
QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "提取成功!")
except:
traceback.print_exc()
@@ -1111,13 +1257,14 @@ class ProgramRunStatusUpload():
try:
if ProgramRunStatusUpload.sha1Value == "":
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,
"Name": ProgramRunStatusUpload.programName.text(),
"Fen": ProgramRunStatusUpload.fen.currentIndex(),
"Wine": o1.currentText()
}).text)["Error"])
except:
+ traceback.print_exc()
QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!"))
def GetSHA1(filePath):
@@ -1145,6 +1292,7 @@ class ProgramSetting():
monogeckoInstaller = None
autoWine = None
runtimeCache = None
+ buildByBottleName = None
def ShowWindow():
ProgramSetting.message = QtWidgets.QMainWindow()
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:")), 8, 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.wineDebug = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启 DEBUG 输出"))
ProgramSetting.defultWine = QtWidgets.QComboBox()
@@ -1177,6 +1326,7 @@ class ProgramSetting():
ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "屏蔽 Wine 默认 Mono 和 Gecko 安装器"))
ProgramSetting.autoWine = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "不显示未检测到的 Wine"))
ProgramSetting.runtimeCache = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启下载缓存"))
+ ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "本软件构建的图标后面添加容器名"))
ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"])
ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"])
ProgramSetting.wineDebug.setChecked(setting["Debug"])
@@ -1188,6 +1338,7 @@ class ProgramSetting():
ProgramSetting.monogeckoInstaller.setChecked(setting["MonoGeckoInstaller"])
ProgramSetting.autoWine.setChecked(setting["AutoWine"])
ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"])
+ ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"])
widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 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.autoWine, 8, 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)
ProgramSetting.message.setCentralWidget(widget)
ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath))
@@ -1228,6 +1380,7 @@ class ProgramSetting():
setting["MonoGeckoInstaller"] = ProgramSetting.monogeckoInstaller.isChecked()
setting["AutoWine"] = ProgramSetting.autoWine.isChecked()
setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked()
+ setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked()
try:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
except:
@@ -1236,7 +1389,103 @@ class ProgramSetting():
return
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,
"AutoWine": True,
"RuntimeCache": True,
- "MustRead": False
+ "MustRead": False,
+ "BuildByBottleName": False
}
if not os.path.exists(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:
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-wine5 stable": "deepin-wine5-stable",
"spark-wine7-devel": "spark-wine7-devel",
@@ -1388,30 +1638,23 @@ exe路径\' 参数 \'
千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可
以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示
N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。
'''
-updateThingsString = '''
一个能让Linux用户更加方便运行Windows应用的程序,内置了对wine图形化的支持和各种Wine工具和自制Wine程序打包器、运行库安装工具等等
同时也内置了基于VirtualBox制作的小白Windows虚拟机安装工具,可以做到只需要用户下载系统镜像并点击安装即可,无需顾及虚拟机安装、创建、虚拟机的分区等等
@@ -1445,8 +1688,21 @@ try: threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL29wZW4vSW5zdGFsbC5waHA=").decode("utf-8")) + "?Version=" + version]).start() except: 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) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) 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(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) 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 应用")) w6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用官方 Wine 适配活动的脚本进行打包")) 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 官网升级程序")) deleteDesktopIcon = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除所有 Wine 程序在启动器的快捷方式")) wineOption.addAction(w1) @@ -1753,6 +2009,24 @@ v1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用 Virtualbox virtualMachine.addAction(v1) 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)")) s1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "360 沙箱云")) s2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "微步云沙箱")) @@ -1876,4 +2150,6 @@ if o1.currentText() == "": wine["没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用"] = "没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用" canUseWine.append("没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用") o1.addItem("没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用") + + sys.exit(app.exec_()) diff --git a/deb/opt/apps/deepin-wine-runner/information.json b/deb/opt/apps/deepin-wine-runner/information.json index 01232be..2b8d7b0 100755 --- a/deb/opt/apps/deepin-wine-runner/information.json +++ b/deb/opt/apps/deepin-wine-runner/information.json @@ -1,5 +1,5 @@ { - "Version": "2.1.0-2", + "Version": "2.2.0-Alpha2", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", @@ -7,7 +7,7 @@ "感谢 @统信UCARE服务 https://mp.weixin.qq.com/s/iOdfNv6phc8F4inackFFTw", "感谢 @星火应用商店 提供部分安装包的源以及本程序的下载地址", "感谢 @delsin 和 @神末shenmo 在 deepin 论坛提供打包器打包的 deb 包自动删除容器的建议", - "感谢 @shenmo 反馈的 2.1.0 打包器问题和 2.1.0-1 终端调用问题", + "感谢 @shenmo 反馈的 2.1.0 打包器问题和 2.1.0-1 终端调用问题", "感谢 @GershonWang 在 https://github.com/gfdgd-xi/deep-wine-runner/issues/1 提供窗口居中的建议", "感谢 @134******28 和 @sgb76 提供的新程序 GUI 布局和实现代码", "感谢 @sgb76 为 Wine 打包器(非生态适配脚本)打包的 i386 deb 提供建议", @@ -22,6 +22,7 @@ "感谢 @五行缺钱 反馈的 2.0.0 在 Deepin 23 缺失依赖 toilet 的问题", "感谢 @云的眼泪 @zhengjl 反馈的 2.0.0 发布忘记把安装包传蓝奏云的问题", "感谢 @虚幻的早晨 提出的添加 DXVK、VKD3D 的功能(VKD3D 暂未实现)", + "感谢 @以勒 修改 Dll 提取工具提示文本的建议", "感谢统信在 Wine 生态适配活动中提供的打包脚本", "也感谢 DXVK 的开发者开发了 DXVK 这个程序,项目链接:https://github.com/doitsujin/dxvk", "也感谢 WineHQ 开发团队开发的 WineHQ,项目网址:https://dl.winehq.org/", diff --git a/deb/opt/apps/deepin-wine-runner/package-script.zip b/deb/opt/apps/deepin-wine-runner/package-script.zip index 24e6c5f..f332145 100755 Binary files a/deb/opt/apps/deepin-wine-runner/package-script.zip and b/deb/opt/apps/deepin-wine-runner/package-script.zip differ diff --git a/information.json b/information.json index 5a10699..2b8d7b0 100755 --- a/information.json +++ b/information.json @@ -1,5 +1,5 @@ { - "Version": "2.2.0", + "Version": "2.2.0-Alpha2", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", diff --git a/mainwindow.py b/mainwindow.py index 37504d8..f0e755e 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -165,7 +165,7 @@ class Runexebutton_threading(QtCore.QThread): option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message " wineUsingOption = "" 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": os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") if o1.currentText() == "基于 box86 的 deepin-wine6-stable": @@ -295,18 +295,24 @@ def make_desktop_on_launcher(): return os.remove(f"{programPath}/dlls-arm.7z") 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: - 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 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()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -343,7 +349,7 @@ def make_desktop_on_desktop(): wineBottonPath = e1.currentText() wineUsingOption = "" 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 not os.path.exists(f"{programPath}/dlls-arm"): 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']} " if not setting["Debug"]: 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: - 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 os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] Name={combobox1.currentText()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -464,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread): if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": 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": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -528,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread): option += "WINEDEBUG=-all " wineUsingOption = "" 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 not os.path.exists(f"{programPath}/dlls-arm"): 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: 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-wine5 stable": "deepin-wine5-stable", "spark-wine7-devel": "spark-wine7-devel", @@ -1635,6 +1647,10 @@ updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的 ※7、基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本 8、更新组件安装的离线列表 9、不再强制依赖深度终端,只做推荐安装 +以下更新内容旧版本也适用(只限 2.1.0 及以上版本) +※1、在“安装更多Wine”的Wine安装工具中上 wine-staging 7.17、wine-staging 6.7、spark-wine7-devel 7.17 +※2、云 Dll 工具上新 Dll +※3、VCPP 运行库安装工具新增 VC6 运行库 ''' for i in information["Thank"]: thankText += f"{i}\n" @@ -1682,7 +1698,11 @@ 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"] + ["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: iconList.append(i) @@ -1766,7 +1786,7 @@ programManager = QtWidgets.QGridLayout() leftDownLayout.addLayout(programManager) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) 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(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) diff --git a/package-script.zip b/package-script.zip index 52cf0af..f332145 100755 Binary files a/package-script.zip and b/package-script.zip differ diff --git a/package-script/information.json b/package-script/information.json index 9823471..3c71ba4 100755 --- a/package-script/information.json +++ b/package-script/information.json @@ -1,3 +1,3 @@ { - "Version": "2.2.0" + "Version": "2.2.0-2" }