diff --git a/VM-source/boot.jpg b/VM-source/boot.jpg new file mode 100644 index 0000000..46787d0 Binary files /dev/null and b/VM-source/boot.jpg differ diff --git a/VM-source/boot.svg b/VM-source/boot.svg new file mode 100644 index 0000000..4822551 --- /dev/null +++ b/VM-source/boot.svg @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="640" + height="480" + viewBox="0 0 169.33333 127" + version="1.1" + id="svg5" + xml:space="preserve" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + sodipodi:docname="boot.svg" + inkscape:export-filename="boot.jpg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview + id="namedview7" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + inkscape:document-units="mm" + showgrid="false" + inkscape:zoom="1.1687991" + inkscape:cx="311.85856" + inkscape:cy="236.99539" + inkscape:window-width="1600" + inkscape:window-height="798" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" /><defs + id="defs2"><clipPath + id="clip0"><path + d="m 858,199 h 339 V 538 H 858 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1207" /></clipPath><clipPath + id="clip1"><path + d="m 859,199 h 337 V 537 H 859 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1210" /></clipPath><clipPath + id="clip2"><path + d="m 859,199 h 337 V 537 H 859 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1213" /></clipPath><clipPath + id="clip3"><path + d="m 859,199 h 363 V 544 H 859 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1216" /></clipPath><clipPath + id="clip4"><path + d="m 859,199 h 363 V 544 H 859 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1219" /></clipPath><clipPath + id="clip5"><path + d="M 878.26,224.409 1022,206.466 1059.23,506.391 915.49,524.333 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1222" /></clipPath><clipPath + id="clip6"><path + d="M 878.26,224.409 1022,206.466 1059.23,506.391 915.49,524.333 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1225" /></clipPath><clipPath + id="clip7"><path + d="m 796.938,234.56 299.092,-37.333 37.23,299.925 -299.094,37.332 z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1228" /></clipPath><clipPath + id="clip8"><path + d="m 903,225 h 320 V 545 H 903 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1231" /></clipPath><clipPath + id="clip9"><path + d="m 903,225 h 320 V 545 H 903 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1234" /></clipPath><image + width="159" + height="159" + xlink:href="data:image/png;base64,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" + preserveAspectRatio="none" + id="img10" /><clipPath + id="clip11"><path + d="M 0,0 H 319.194 V 319.194 H 0 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1238" /></clipPath><clipPath + id="clip12"><path + d="m 949,271 h 228 V 499 H 949 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1241" /></clipPath><clipPath + id="clip13"><path + d="m 949,271 h 228 V 499 H 949 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1244" /></clipPath><clipPath + id="clip14"><path + d="m 949,271 h 228 V 499 H 949 Z" + fill-rule="evenodd" + clip-rule="evenodd" + id="path1247" /></clipPath></defs><g + inkscape:label="图层 1" + inkscape:groupmode="layer" + id="layer1"><rect + style="fill:#000000;stroke-width:0.614837;stroke-opacity:0.830599" + id="rect234" + width="169.33333" + height="127" + x="0" + y="0" /><g + style="overflow:hidden" + id="g1461" + transform="matrix(0.0671707,0,0,0.0671707,9.5130187,35.664549)"><g + clip-path="url(#clipPath1435)" + id="g1278" + transform="translate(-858,-199)"><path + d="m 474.948,249.692 c 0,-30.872 25.025,-55.897 55.897,-55.897 h 223.581 c 30.871,0 55.897,25.025 55.897,55.897 v 223.581 c 0,30.871 -25.026,55.897 -55.897,55.897 H 530.845 c -30.872,0 -55.897,-25.026 -55.897,-55.897 z" + fill="#990000" + fill-rule="evenodd" + transform="matrix(1,0,0,1.00279,385.057,5.67096)" + id="path1252" /><g + clip-path="url(#clip5)" + id="g1260"><g + clip-path="url(#clip6)" + id="g1258"><g + clip-path="url(#clip7)" + id="g1256"><path + d="m 193.623,30.1412 c -1.178,-3.2377 -4.121,-5.416 -7.595,-5.416 h -70.643 c -3.533,0 -6.418,2.1783 -7.654,5.416 -5.474,14.7175 -18.2491,51.2756 -18.2491,73.4698 v 2.826 c 0,11.303 0,26.726 16.7191,43.857 3.827,3.944 8.418,7.594 13.246,11.48 11.244,9.007 22.841,18.309 22.841,29.552 v 67.7 c 0,0.648 -0.53,1.178 -1.177,1.178 h -33.615 c -4.651,0 -8.4183,3.709 -8.4183,8.241 0,4.533 3.7673,8.243 8.4183,8.243 h 86.421 c 4.65,0 8.418,-3.71 8.418,-8.243 0,-4.532 -3.768,-8.241 -8.418,-8.241 h -33.615 c -0.647,0 -1.177,-0.53 -1.177,-1.178 v -67.7 c 0,-11.243 11.597,-20.545 22.841,-29.552 4.827,-3.886 9.36,-7.536 13.245,-11.48 16.72,-17.131 16.72,-32.554 16.72,-43.857 v -2.826 c 0,-22.0765 -12.775,-58.7523 -18.308,-73.4698 z m -0.825,60.106 c -0.117,0.1766 -0.412,0.4121 -0.942,0.4121 h -82.299 c -0.471,0 -0.765,-0.2944 -0.942,-0.4121 -0.119,-0.1766 -0.354,-0.4709 -0.236,-1.0008 3.002,-15.365 8.713,-35.0863 12.716,-47.2134 0.176,-0.471 0.647,-0.8242 1.118,-0.8242 h 56.986 c 0.53,0 1.001,0.3532 1.119,0.8242 3.944,12.186 9.655,31.8484 12.715,47.2134 0.119,0.4709 -0.117,0.8242 -0.235,1.0008 z" + fill="#ffffff" + fill-opacity="0.65098" + transform="matrix(0.992299,-0.123862,0.124196,0.994978,796.938,234.56)" + id="path1254" /></g></g></g><g + clip-path="url(#clip8)" + id="g1268"><g + clip-path="url(#clip9)" + id="g1266"><g + clip-path="url(#clip11)" + transform="matrix(1.00036,0,0,1,903.181,225.18)" + id="g1264"><use + width="100%" + height="100%" + xlink:href="#img10" + transform="scale(2.00751)" + id="use1262" /></g></g></g><g + clip-path="url(#clip12)" + id="g1276"><g + clip-path="url(#clip13)" + id="g1274"><g + clip-path="url(#clip14)" + id="g1272"><path + d="m 200.96,104.761 c 0,0 -33.011,7.036 -42.148,9.491 -9.049,2.456 -20.267,-15.3323 -23.276,-15.9739 -1.924,5.5759 -8.141,21.9469 -11.859,33.0549 5.753,-0.177 35.599,8.872 36.683,14.137 1.239,5.333 15.178,63.078 15.178,63.078 0,0 5.907,12.412 -10.864,16.947 -16.792,4.536 -17.545,-9.27 -17.545,-9.27 0,0 -11.725,-44.293 -12.765,-46.97 -0.974,-2.678 -22.833,-7.169 -27.834,-5.819 -5.043,1.371 -15.8406,39.183 -26.5048,41.749 -13.6952,3.318 -53.8074,-21.041 -53.8074,-21.041 0,0 -15.8413,-3.916 -12.6111,-18.783 C 16.9033,150.603 32.28,154.63 32.28,154.63 c 0,0 28.4082,15.62 31.6826,13.784 3.3187,-1.859 5.1994,-12.634 10.0447,-23.077 0.1991,-3.938 11.35,-35.244 11.35,-35.244 0,0 6.1728,-20.8417 3.7169,-22.1471 -3.385,-1.7921 -6.925,2.0355 -8.7834,5.2215 -1.8585,3.1637 -9.2261,16.1956 -21.5496,33.1646 -10.9518,15.111 -30.4879,1.085 -22.3681,-13.031 6.748,-11.749 24.7133,-45.3338 37.6342,-51.6615 13.0094,-6.3719 35.4437,-9.9118 54.5377,-5.4427 19.182,4.3807 32.634,26.1073 36.395,28.9835 3.673,2.7656 29.515,-5.5976 29.515,-5.5976 0,0 14.712,-5.1107 18.363,8.319 C 216.49,101.42 200.96,104.761 200.96,104.761 Z M 140.514,49.4045 C 126.974,53.0773 113.19,45.223 109.562,31.8154 105.955,18.4742 113.854,4.66832 127.395,0.995614 140.913,-2.65497 154.741,5.26569 158.347,18.6069 c 3.651,13.4076 -4.336,27.125 -17.833,30.7976 z" + fill="#ffffff" + transform="matrix(1.00164,0,0,1,949.371,271.498)" + id="path1270" /></g></g></g></g></g><text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:7.60885px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.190221" + x="43.820358" + y="45.367035" + id="text1934"><tspan + sodipodi:role="line" + id="tspan1932" + style="fill:#eeeeee;fill-opacity:1;stroke-width:0.190221" + x="43.820358" + y="45.367035">Wine 运行器虚拟机工具</tspan><tspan + sodipodi:role="line" + style="fill:#eeeeee;fill-opacity:1;stroke-width:0.190221" + x="43.820358" + y="54.878098" + id="tspan1986">Wine Runner Virtual Machine Tool</tspan></text><text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.41808px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.110452" + x="84.604897" + y="114.99696" + id="text2716"><tspan + sodipodi:role="line" + id="tspan2714" + style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.110452" + x="84.604897" + y="114.99696">按 ESC 键选择启动方式</tspan><tspan + sodipodi:role="line" + style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.110452" + x="84.604897" + y="120.51955" + id="tspan3446">Press ESC for boot menu.</tspan></text></g></svg> diff --git a/VM-source/qemu.cpp b/VM-source/qemu.cpp index a77bb04..35e169f 100644 --- a/VM-source/qemu.cpp +++ b/VM-source/qemu.cpp @@ -109,28 +109,39 @@ int qemu::StartArmhf() { qDebug() << commandOption; if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "aarch64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){ - return system(("qemu-system-arm -display vnc=:5 -display gtk --enable-kvm -cpu host -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-arm --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk --enable-kvm -cpu host -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } - return system(("qemu-system-arm --boot d -display vnc=:5 -display gtk -cpu max -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-arm --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk -cpu max -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } int qemu::StartAarch64() { + QString bootScreenLogo = ""; + // 判断 boot 文件是否存在 + if(QFile::exists(QCoreApplication::applicationDirPath() + "/boot.jpg")) { + bootScreenLogo = QCoreApplication::applicationDirPath() + "/boot.jpg"; + } + else { + // 写入 logo + QFile::copy(":/boot.jpg", "/tmp/deep-wine-runner-boot.jpg"); + bootScreenLogo = "/tmp/deep-wine-runner-boot.jpg"; + } qDebug() << commandOption; if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "aarch64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){ - return system(("qemu-system-aarch64 --boot d -display vnc=:5 -display gtk --enable-kvm -cpu host -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-aarch64 --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk --enable-kvm -cpu host -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } - return system(("qemu-system-aarch64 --boot d -display vnc=:5 -display gtk -cpu max -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-aarch64 --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk -cpu max -M virt " + commandOption + " -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } int qemu::StartLoong64() { - + return 1; } int qemu::Start(bool unShown) { QString newCommandOption = commandOption; + qDebug() << GetBootLogoPath(); if(isUEFI) { newCommandOption += " -vga none -device virtio-gpu-pci -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 -device usb-kbd,id=keyboard,bus=xhci.0,port=2 "; } @@ -139,10 +150,9 @@ int qemu::Start(bool unShown) } qDebug() << commandOption; if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "x86_64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){ - qDebug() << ("qemu-system-x86_64 --boot d -display vnc=:5 -display gtk --enable-kvm -cpu host " + newCommandOption + " > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &"); - return system(("qemu-system-x86_64 --boot d -display vnc=:5 -display gtk --enable-kvm -cpu host " + newCommandOption + " > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-x86_64 --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk --enable-kvm -cpu host " + newCommandOption + " > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } - return system(("qemu-system-x86_64 --boot d -display vnc=:5 -display gtk -nic model=rtl8139 " + newCommandOption + " > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); + return system(("qemu-system-x86_64 --boot 'splash=" + GetBootLogoPath() + ",order=d,menu=on,splash-time=2000' -display vnc=:5 -display gtk -nic model=rtl8139 " + newCommandOption + " > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 &").toLatin1()); } int qemu::Stop() { @@ -277,3 +287,21 @@ int qemu::AddDiskSpace(QString path, double data) { return system(("qemu-img resize '" + path + "' +" + QString::number(data) + "G").toUtf8()); } + +QString qemu::GetBootLogoPath() +{ + QString bootScreenLogo = ""; + // 判断 boot 文件是否存在 + if(QFile::exists(QCoreApplication::applicationDirPath() + "/boot.jpg")) { + bootScreenLogo = QCoreApplication::applicationDirPath() + "/boot.jpg"; + } + else { + // 写入 logo + if(QFile::exists("/tmp/deep-wine-runner-boot.jpg")) { + QFile::remove("/tmp/deep-wine-runner-boot.jpg"); + } + QFile::copy(":/boot.jpg", "/tmp/deep-wine-runner-boot.jpg"); + bootScreenLogo = "/tmp/deep-wine-runner-boot.jpg"; + } + return bootScreenLogo; +} diff --git a/VM-source/qemu.h b/VM-source/qemu.h index 12cd1e9..9f00003 100644 --- a/VM-source/qemu.h +++ b/VM-source/qemu.h @@ -53,6 +53,7 @@ public: private: QString commandOption = ""; bool isUEFI = false; + QString GetBootLogoPath(); }; diff --git a/VM-source/图标.qrc b/VM-source/图标.qrc index e7e57be..0d6fd27 100755 --- a/VM-source/图标.qrc +++ b/VM-source/图标.qrc @@ -5,6 +5,8 @@ <file>LANG/virtualmachine-en_US.qm</file> <file>LANG/virtualmachine-en_US.ts</file> <file>application-vnd.oasis.opendocument.text.svg</file> + <file>boot.jpg</file> + <file>boot.svg</file> </qresource> <qresource prefix="/picture"> <file>截图_VirtualBox Machine_20220712142929.png</file> diff --git a/VM/boot.jpg b/VM/boot.jpg new file mode 100644 index 0000000..46787d0 Binary files /dev/null and b/VM/boot.jpg differ