Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3179772d05 | ||
| 2bc597ce84 | |||
| d929107117 | |||
| 6d56abbb28 | |||
| a76191da3a | |||
| 3fd7b7532f | |||
| 22f4430a27 | |||
| 40938dc131 | |||
| a7bf65f407 | |||
| 3272c825c6 | |||
| acfb32d51f | |||
| 4629bb495b | |||
| 76347629d1 | |||
| 197c5706dd | |||
| 4d318701ac | |||
| 34e2062f83 | |||
| 0a485769ed | |||
| ef7737f0d9 | |||
| 1c13377979 | |||
| 931fd3114a | |||
| 2c8e83c2d4 | |||
| 9f591340b0 | |||
| 878ce96a50 | |||
| 6c0549afe6 | |||
| 4d30f1c04d | |||
| b481f01609 | |||
| 864be06001 | |||
| 189d7a1ba1 | |||
| c2e598c670 | |||
| 15c15dc5f8 | |||
| 676d52c964 | |||
| 7138c6fbb9 | |||
| 979c573768 | |||
| 9ea5e297b6 | |||
| 624b4c8b3a | |||
| 0c4e736b12 | |||
| 0d0438bddd | |||
| 3fe1ff8a61 | |||
| 1fe4ed75f4 | |||
| ebf9474bc6 | |||
| d7e131c778 | |||
| 9184f42677 | |||
| 674eff5f10 | |||
| 910404b54d | |||
| ab60ec15b0 | |||
| 535dccb183 | |||
| a515570ee3 | |||
| c73e32fa39 | |||
| ca88d5f62c | |||
| df561d3d03 | |||
| 744d2aa262 | |||
| 7fb1f60aae | |||
| 058f025353 | |||
| d8360c6e59 | |||
| 7fa1edb3f8 | |||
| 82bd073ff8 | |||
| ebed98fd25 | |||
| 1ec62bbf86 | |||
| f79bac9d6c | |||
| 6863e58413 | |||
| 96319869b6 | |||
| bc5aca0fd7 | |||
| bf18411f7a | |||
| 6ce9d63a19 | |||
| 4022c3a17b | |||
| 9ae95d6008 | |||
| 81576681e8 | |||
| aaeb80fde3 | |||
| df95e7d0b0 | |||
| c87218232d | |||
| 3f1fefa8a5 | |||
| 88d449d3f4 | |||
| d902a6df65 | |||
| 082cb21059 | |||
| b491db6b60 | |||
| 9b51368f9c | |||
| 86123c3358 | |||
| 29b3196b9a | |||
| 0f26bdd26b | |||
| e15ce0ceff | |||
| 6927b3749b | |||
| 8c8a471072 | |||
| b61da796c5 | |||
| fc08a3485e | |||
| ee0c213899 | |||
| d8d09128e6 | |||
| 673659abd7 | |||
| 56e93dbb72 | |||
| 6ca3cea617 | |||
| 9fed1005dd | |||
| 24131b0050 | |||
| 83fd8fffd4 | |||
| b6f8145fa5 | |||
| 1d59f6b4f1 | |||
| ab31fc6d65 | |||
| c88521a3e7 | |||
| 385348a7b9 | |||
| 3bcff8dd87 | |||
| 0623b95fca | |||
| fbd14710a5 | |||
| 9a212ca212 | |||
| ee6b166dd7 | |||
| fcd4e5e610 | |||
| dd4785d8e2 | |||
| e6df6addd7 | |||
| 9e1e898da4 | |||
| ff60f69565 | |||
| c5577568c9 | |||
| eb6fe87485 | |||
| e9f6847e57 | |||
| 47f1b2a843 | |||
| d95a4cd9f4 | |||
| e5ffd06b26 | |||
| f327216855 | |||
| d335a72aee | |||
| ee8be07185 | |||
| 4f08e44ca3 | |||
| caa08cfa8d | |||
| a4ab3b27d1 | |||
| 4caf1a3be5 |
17
.github/workflows/DaoXiangHu-stable
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
mirror_style release
|
||||||
|
download_style apt
|
||||||
|
finddebs_style from-indices
|
||||||
|
variants - buildd fakechroot minbase
|
||||||
|
keyring /usr/share/keyrings/debian-archive-keyring.gpg
|
||||||
|
default_mirror https://pkg.loongnix.cn/loongnix/20
|
||||||
|
|
||||||
|
# include common settings
|
||||||
|
if [ -e "$DEBOOTSTRAP_DIR/scripts/debian-common" ]; then
|
||||||
|
. "$DEBOOTSTRAP_DIR/scripts/debian-common"
|
||||||
|
elif [ -e /debootstrap/debian-common ]; then
|
||||||
|
. /debootstrap/debian-common
|
||||||
|
elif [ -e "$DEBOOTSTRAP_DIR/debian-common" ]; then
|
||||||
|
. "$DEBOOTSTRAP_DIR/debian-common"
|
||||||
|
else
|
||||||
|
error 1 NOCOMMON "File not found: debian-common"
|
||||||
|
fi
|
||||||
29
.github/workflows/auto-building-rpm.yml
vendored
@@ -1,29 +0,0 @@
|
|||||||
name: Auto Building Wine Runner(rpm)
|
|
||||||
run-name: ${{ github.actor }} Auto Building Wine Runner(rpm) 🚀
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
Explore-GitHub-Actions:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Building RPM
|
|
||||||
env:
|
|
||||||
GUSER: ${{ secrets.GUSER }}
|
|
||||||
PASSWORD: ${{ secrets.PASSWORD }}
|
|
||||||
UPLOADURL: ${{ secrets.UPLOADURL }}
|
|
||||||
run: |
|
|
||||||
# 配置环境
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install git dpkg-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qt5-qmake rpm -y
|
|
||||||
git clone https://github.com/gfdgd-xi/deep-wine-runner
|
|
||||||
cd deep-wine-runner
|
|
||||||
make package-rpm
|
|
||||||
mv spark-deepin-wine-runner*.rpm /home/runner/spark-deepin-wine-runner.rpm
|
|
||||||
- name: upload result
|
|
||||||
uses: actions/upload-artifact@v1
|
|
||||||
with:
|
|
||||||
name: spark-deepin-wine-runner.rpm
|
|
||||||
path: /home/runner/spark-deepin-wine-runner.rpm
|
|
||||||
|
|
||||||
|
|
||||||
73
.github/workflows/auto-building.yml
vendored
@@ -1,17 +1,13 @@
|
|||||||
name: Auto Building Wine Runner(deb)
|
name: Auto Building Wine Runner
|
||||||
run-name: ${{ github.actor }} Auto Building Wine Runner(deb) 🚀
|
run-name: ${{ github.actor }} Auto Building Wine Runner 🚀
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
Explore-GitHub-Actions:
|
deb:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Building DEB
|
- name: Building DEB
|
||||||
env:
|
|
||||||
GUSER: ${{ secrets.GUSER }}
|
|
||||||
PASSWORD: ${{ secrets.PASSWORD }}
|
|
||||||
UPLOADURL: ${{ secrets.UPLOADURL }}
|
|
||||||
run: |
|
run: |
|
||||||
# 配置环境
|
# 配置环境
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@@ -22,14 +18,73 @@ jobs:
|
|||||||
mv spark-deepin-wine-runner.deb ~
|
mv spark-deepin-wine-runner.deb ~
|
||||||
mv spark-deepin-wine-runner-ace.deb ~
|
mv spark-deepin-wine-runner-ace.deb ~
|
||||||
- name: upload result
|
- name: upload result
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: spark-deepin-wine-runner.deb
|
name: spark-deepin-wine-runner.deb
|
||||||
path: /home/runner/spark-deepin-wine-runner.deb
|
path: /home/runner/spark-deepin-wine-runner.deb
|
||||||
- name: upload result
|
- name: upload result
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: spark-deepin-wine-runner-ace.deb
|
name: spark-deepin-wine-runner-ace.deb
|
||||||
path: /home/runner/spark-deepin-wine-runner-ace.deb
|
path: /home/runner/spark-deepin-wine-runner-ace.deb
|
||||||
|
- name: Building DEB (termux)
|
||||||
|
run: |
|
||||||
|
cd deep-wine-runner
|
||||||
|
make package-termux-deb -j4
|
||||||
|
mv spark-deepin-wine-runner-termux.deb ~
|
||||||
|
- name: upload result
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: spark-deepin-wine-runner-termux.deb
|
||||||
|
path: /home/runner/spark-deepin-wine-runner-termux.deb
|
||||||
|
|
||||||
|
rpm:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Building RPM
|
||||||
|
env:
|
||||||
|
GUSER: ${{ secrets.GUSER }}
|
||||||
|
PASSWORD: ${{ secrets.PASSWORD }}
|
||||||
|
UPLOADURL: ${{ secrets.UPLOADURL }}
|
||||||
|
run: |
|
||||||
|
# 配置环境
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install git dpkg-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qt5-qmake rpm -y
|
||||||
|
git clone https://github.com/gfdgd-xi/deep-wine-runner
|
||||||
|
cd deep-wine-runner
|
||||||
|
make package-rpm
|
||||||
|
mv spark-deepin-wine-runner*.rpm /home/runner/spark-deepin-wine-runner.rpm
|
||||||
|
- name: upload result
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: spark-deepin-wine-runner.rpm
|
||||||
|
path: /home/runner/spark-deepin-wine-runner.rpm
|
||||||
|
|
||||||
|
pkg:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: archlinux
|
||||||
|
steps:
|
||||||
|
- name: Building PKG
|
||||||
|
env:
|
||||||
|
GUSER: ${{ secrets.GUSER }}
|
||||||
|
PASSWORD: ${{ secrets.PASSWORD }}
|
||||||
|
UPLOADURL: ${{ secrets.UPLOADURL }}
|
||||||
|
run: |
|
||||||
|
# 配置环境
|
||||||
|
pacman -Sy
|
||||||
|
pacman -S yay git sudo
|
||||||
|
pacman -S dpkg qt5-base -y
|
||||||
|
yay install
|
||||||
|
git clone https://github.com/gfdgd-xi/deep-wine-runner
|
||||||
|
cd deep-wine-runner
|
||||||
|
make package-deb -j4
|
||||||
|
make package-pkg -j4
|
||||||
|
cd ..
|
||||||
|
mv spark-deepin-wine-runner*.pkg.tar.zst ../spark-deepin-wine-runner.pkg.tar.zst
|
||||||
|
- name: upload result
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: spark-deepin-wine-runner.pkg.tar.zst
|
||||||
|
path: spark-deepin-wine-runner.pkg.tar.zst
|
||||||
|
|
||||||
|
|
||||||
200
.github/workflows/building-off-line-package.yml
vendored
@@ -1,16 +1,13 @@
|
|||||||
name: Building Wine Runner Off-line Pages(amd64)
|
name: Building Wine Runner Off-line Pages
|
||||||
run-name: ${{ github.actor }} Building Wine Runner Off-line Pages(amd64) 🚀
|
run-name: ${{ github.actor }} Building Wine Runner Off-line Pages 🚀
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
Explore-GitHub-Actions:
|
amd64:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Building DEB
|
- name: Building DEB
|
||||||
env:
|
|
||||||
GUSER: ${{ secrets.GUSER }}
|
|
||||||
PASSWORD: ${{ secrets.PASSWORD }}
|
|
||||||
UPLOADURL: ${{ secrets.UPLOADURL }}
|
|
||||||
run: |
|
run: |
|
||||||
# 获取所需数据
|
# 获取所需数据
|
||||||
cpu=$(cat /proc/cpuinfo | grep processor | wc -l)
|
cpu=$(cat /proc/cpuinfo | grep processor | wc -l)
|
||||||
@@ -30,9 +27,11 @@ jobs:
|
|||||||
## 加入 wine 源
|
## 加入 wine 源
|
||||||
sudo chroot debian dpkg --add-architecture i386
|
sudo chroot debian dpkg --add-architecture i386
|
||||||
sudo chroot debian apt update
|
sudo chroot debian apt update
|
||||||
sudo chroot debian apt install wget -y
|
sudo chroot debian apt install sudo gpg wget -y
|
||||||
sudo chroot debian wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
|
sudo chroot debian wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
|
||||||
sudo chroot debian wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/debian/dists/bookworm/winehq-bookworm.sources
|
sudo chroot debian wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/debian/dists/bookworm/winehq-bookworm.sources
|
||||||
|
sudo chroot debian bash -c "echo 'deb [trusted=true] https://repo.gxde.top/gxde-os/bixie ./' | sudo tee /etc/apt/sources.list.d/gxde-stable.list"
|
||||||
|
sudo chroot debian bash -c "echo 'deb [trusted=true] https://repo.gxde.top/gxde-os/tianlu ./' | sudo tee /etc/apt/sources.list.d/gxde-testing.list"
|
||||||
sudo chroot debian apt update
|
sudo chroot debian apt update
|
||||||
## 获取 Wine 运行器安装包
|
## 获取 Wine 运行器安装包
|
||||||
git clone https://github.com/gfdgd-xi/deep-wine-runner --depth=1
|
git clone https://github.com/gfdgd-xi/deep-wine-runner --depth=1
|
||||||
@@ -44,16 +43,29 @@ jobs:
|
|||||||
mv deep-wine-runner/spark-deepin-wine-runner.deb debian/tmp/wine-runner.deb
|
mv deep-wine-runner/spark-deepin-wine-runner.deb debian/tmp/wine-runner.deb
|
||||||
## 安装
|
## 安装
|
||||||
sudo chroot debian apt install locales /tmp/wine-runner.deb winehq-devel fcitx xfce4-terminal -y
|
sudo chroot debian apt install locales /tmp/wine-runner.deb winehq-devel fcitx xfce4-terminal -y
|
||||||
|
sudo chroot debian apt install locales qtwayland5 xwayland thunar -y
|
||||||
|
sudo chroot debian apt install libxenmisc4.17 libxenstore4 libxenforeignmemory1 -y
|
||||||
# 构建软件包
|
# 构建软件包
|
||||||
mkdir package/opt -p
|
|
||||||
mkdir package/runner -p
|
mkdir package/runner -p
|
||||||
sudo cp debian/opt/wine-devel package/opt -rv
|
|
||||||
sudo cp debian/usr/bin package -rv
|
sudo cp debian/usr/bin package -rv
|
||||||
sudo cp debian/usr/lib package -rv
|
sudo cp debian/usr/lib package -rv
|
||||||
sudo cp debian/usr/lib32 package -rv
|
sudo cp debian/usr/share package -rv
|
||||||
sudo cp debian/usr/lib64 package -rv
|
sudo cp debian/usr/lib64 package -rv
|
||||||
sudo cp debian/opt/apps/deepin-wine-runner/* package/runner -rv
|
sudo cp debian/opt/apps/deepin-wine-runner/* package/runner -rv
|
||||||
|
# 精简运行器体积
|
||||||
|
sudo rm -rf package/runner/2048
|
||||||
|
sudo rm -rf package/runner/geek.exe
|
||||||
|
sudo rm -rf package/runner/BeCyIconGrabber.exe
|
||||||
|
sudo rm -rf package/runner/Icon
|
||||||
|
sudo rm -rf package/runner/RegShot.exe
|
||||||
|
sudo rm -rf package/runner/novnc
|
||||||
|
sudo rm -rf package/bin/wine*
|
||||||
|
# 修复 which 命令的问题导致无法正常识别终端的问题
|
||||||
|
sudo cp package/bin/which.debianutils package/bin/which -rv
|
||||||
|
# 内置 winehq
|
||||||
|
sudo cp debian/opt/wine-devel package/runner/wine -rv
|
||||||
cp deep-wine-runner/off-line-shell/run.sh package -rv
|
cp deep-wine-runner/off-line-shell/run.sh package -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/run-system-bwrap.sh package -rv
|
||||||
cp deep-wine-runner/off-line-shell/bwrap_amd64 package/bwrap -rv
|
cp deep-wine-runner/off-line-shell/bwrap_amd64 package/bwrap -rv
|
||||||
sudo chmod 777 -Rv package ; true
|
sudo chmod 777 -Rv package ; true
|
||||||
cd package
|
cd package
|
||||||
@@ -62,17 +74,169 @@ jobs:
|
|||||||
tar -cvf ../spark-deepin-wine-runner-off-line.tar *
|
tar -cvf ../spark-deepin-wine-runner-off-line.tar *
|
||||||
cd ..
|
cd ..
|
||||||
xz -T $cpu spark-deepin-wine-runner-off-line.tar
|
xz -T $cpu spark-deepin-wine-runner-off-line.tar
|
||||||
cp deep-wine-runner/off-line-shell/compression-packager.sh spark-deepin-wine-runner-off-line.sh
|
|
||||||
cat spark-deepin-wine-runner-off-line.tar.xz >> spark-deepin-wine-runner-off-line.sh
|
|
||||||
- name: upload result
|
- name: upload result
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: spark-deepin-wine-runner-off-line.tar.xz
|
name: spark-deepin-wine-runner-off-line-amd64.tar.xz
|
||||||
path: /home/runner/spark-deepin-wine-runner-off-line.tar.xz
|
path: /home/runner/spark-deepin-wine-runner-off-line.tar.xz
|
||||||
|
|
||||||
|
arm64:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Building DEB
|
||||||
|
run: |
|
||||||
|
# 获取所需数据
|
||||||
|
cpu=$(cat /proc/cpuinfo | grep processor | wc -l)
|
||||||
|
# 配置环境
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install python3-requests debootstrap xz-utils qemu-user-static -y
|
||||||
|
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools psmisc -y
|
||||||
|
cd ~
|
||||||
|
mkdir package
|
||||||
|
# 部署 chroot 环境
|
||||||
|
sudo debootstrap --arch=arm64 bookworm debian
|
||||||
|
wget https://github.com/gfdgd-xi/deep-wine-runner/raw/main/pardus-chroot
|
||||||
|
sudo cp pardus-chroot /usr/bin
|
||||||
|
sudo chmod 777 /usr/bin/pardus-chroot
|
||||||
|
sudo pardus-chroot debian
|
||||||
|
### 配置容器
|
||||||
|
## 加入 wine 源
|
||||||
|
sudo chroot debian apt update
|
||||||
|
sudo chroot debian apt install sudo gpg wget -y
|
||||||
|
sudo chroot debian wget https://ryanfortner.github.io/box64-debs/box64.list -O /etc/apt/sources.list.d/box64.list
|
||||||
|
sudo chroot debian bash -c "wget -qO- https://ryanfortner.github.io/box64-debs/KEY.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box64-debs-archive-keyring.gpg"
|
||||||
|
sudo chroot debian bash -c "echo 'deb [trusted=true] https://repo.gxde.top/gxde-os/bixie ./' | sudo tee /etc/apt/sources.list.d/gxde-stable.list"
|
||||||
|
sudo chroot debian bash -c "echo 'deb [trusted=true] https://repo.gxde.top/gxde-os/tianlu ./' | sudo tee /etc/apt/sources.list.d/gxde-testing.list"
|
||||||
|
sudo chroot debian apt update
|
||||||
|
sudo chroot debian apt install box64 hangover-wine -y
|
||||||
|
## 获取 Wine 运行器安装包
|
||||||
|
git clone https://github.com/gfdgd-xi/deep-wine-runner --depth=1
|
||||||
|
cd deep-wine-runner
|
||||||
|
make package-deb
|
||||||
|
cd ..
|
||||||
|
url=`python3 deep-wine-runner/off-line-shell/GetNewestDebUrl.py`
|
||||||
|
#wget $url
|
||||||
|
mv deep-wine-runner/spark-deepin-wine-runner.deb debian/tmp/wine-runner.deb
|
||||||
|
## 安装
|
||||||
|
sudo chroot debian apt install locales /tmp/wine-runner.deb fcitx xfce4-terminal qtwayland5 xwayland thunar -y
|
||||||
|
sudo chroot debian apt install libxenmisc4.17 libxenstore4 libxenforeignmemory1 -y
|
||||||
|
# 构建软件包
|
||||||
|
mkdir package/runner -p
|
||||||
|
sudo cp debian/usr/local/bin package -rv
|
||||||
|
sudo cp debian/usr/bin package -rv
|
||||||
|
sudo cp debian/usr/lib package -rv
|
||||||
|
sudo cp debian/usr/share package -rv
|
||||||
|
#sudo cp debian/usr/lib64 package -rv
|
||||||
|
sudo cp debian/opt/apps/deepin-wine-runner/* package/runner -rv
|
||||||
|
# 精简运行器体积
|
||||||
|
sudo rm -rf package/runner/2048
|
||||||
|
sudo rm -rf package/runner/geek.exe
|
||||||
|
sudo rm -rf package/runner/BeCyIconGrabber.exe
|
||||||
|
sudo rm -rf package/runner/Icon
|
||||||
|
sudo rm -rf package/runner/RegShot.exe
|
||||||
|
sudo rm -rf package/runner/novnc
|
||||||
|
# 修复 which 命令的问题导致无法正常识别终端的问题
|
||||||
|
sudo cp package/bin/which.debianutils package/bin/which -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/run.sh package -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/run-system-bwrap.sh package -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/bwrap_arm64 package/bwrap -rv
|
||||||
|
sudo chmod 777 -Rv package ; true
|
||||||
|
cd package
|
||||||
|
# 添加 Wine 运行器离线模式标识
|
||||||
|
touch runner/off-line.lock
|
||||||
|
tar -cvf ../spark-deepin-wine-runner-off-line.tar *
|
||||||
|
cd ..
|
||||||
|
xz -T $cpu spark-deepin-wine-runner-off-line.tar
|
||||||
- name: upload result
|
- name: upload result
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: spark-deepin-wine-runner-off-line.sh
|
name: spark-deepin-wine-runner-off-line-arm64.tar.xz
|
||||||
path: /home/runner/spark-deepin-wine-runner-off-line.sh
|
path: /home/runner/spark-deepin-wine-runner-off-line.tar.xz
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
loongarch64:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Building DEB
|
||||||
|
run: |
|
||||||
|
# 获取所需数据
|
||||||
|
cpu=$(cat /proc/cpuinfo | grep processor | wc -l)
|
||||||
|
# 配置环境
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install python3-requests debootstrap xz-utils qemu-user-static git aria2 squashfs-tools -y
|
||||||
|
sudo apt install binfmt-support qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools psmisc wget -y
|
||||||
|
git clone https://github.com/gfdgd-xi/deep-wine-runner --depth=1
|
||||||
|
sudo cp deep-wine-runner/.github/workflows/DaoXiangHu-stable /usr/share/debootstrap/scripts/
|
||||||
|
git clone https://gitee.com/loongarch-kvm/qemu-loongarch64-static
|
||||||
|
cd qemu-loongarch64-static
|
||||||
|
tar -xvf qemu-loongarch64-static.tar.gz
|
||||||
|
cd qemu-loongarch64-static
|
||||||
|
sudo bash qemu-binfmt-conf.sh
|
||||||
|
sudo cp qemu-loongarch64 /usr/local/bin/
|
||||||
|
cd ~
|
||||||
|
mkdir package
|
||||||
|
# 部署 chroot 环境
|
||||||
|
#sudo debootstrap --no-check-gpg --arch=loongarch64 DaoXiangHu-stable debian https://pkg.loongnix.cn/loongnix/20
|
||||||
|
aria2c -x 16 -s 16 https://sourceforge.net/projects/deep-wine-runner-wine-download/files/loongnix/filesystem.squashfs/download
|
||||||
|
sudo unsquashfs filesystem.squashfs
|
||||||
|
sudo mv squashfs-root debian
|
||||||
|
sudo cp /usr/local/bin/qemu-loongarch64 debian/usr/local/bin/qemu-loongarch64 -rv
|
||||||
|
# 写入 DNS
|
||||||
|
echo "nameserver 8.8.8.8" | sudo tee debian/etc/resolv.conf
|
||||||
|
wget https://github.com/gfdgd-xi/deep-wine-runner/raw/main/pardus-chroot
|
||||||
|
sudo cp pardus-chroot /usr/bin
|
||||||
|
sudo chmod 777 /usr/bin/pardus-chroot
|
||||||
|
sudo pardus-chroot debian
|
||||||
|
### 配置容器
|
||||||
|
## 加入 wine 源
|
||||||
|
sudo chroot debian apt update
|
||||||
|
sudo chroot debian apt install sudo gpg wget -y
|
||||||
|
sudo chroot debian apt update
|
||||||
|
sudo chroot debian apt install -y lat i386-runtime-base i386-runtime-extra
|
||||||
|
sudo chroot debian apt install -y wine
|
||||||
|
## 获取 Wine 运行器安装包
|
||||||
|
git clone https://github.com/gfdgd-xi/deep-wine-runner --depth=1
|
||||||
|
cd deep-wine-runner
|
||||||
|
make package-deb
|
||||||
|
cd ..
|
||||||
|
url=`python3 deep-wine-runner/off-line-shell/GetNewestDebUrl.py`
|
||||||
|
#wget $url
|
||||||
|
mv deep-wine-runner/spark-deepin-wine-runner.deb debian/tmp/wine-runner.deb
|
||||||
|
## 安装
|
||||||
|
sudo chroot debian apt install locales /tmp/wine-runner.deb fcitx xfce4-terminal qtwayland5 xwayland thunar -y
|
||||||
|
# 构建软件包
|
||||||
|
mkdir package/runner -p
|
||||||
|
sudo cp debian/usr/local/bin package -rv
|
||||||
|
sudo cp debian/usr/bin package -rv
|
||||||
|
sudo cp debian/usr/lib package -rv
|
||||||
|
sudo cp debian/usr/share package -rv
|
||||||
|
sudo cp debian/usr/gnemul package -rv
|
||||||
|
#sudo cp debian/usr/lib64 package -rv
|
||||||
|
sudo cp debian/opt/apps/deepin-wine-runner/* package/runner -rv
|
||||||
|
sudo cp debian/opt/wine-6.0 package/runner/wine -rv
|
||||||
|
# 精简运行器体积
|
||||||
|
sudo rm -rf package/runner/2048
|
||||||
|
sudo rm -rf package/runner/geek.exe
|
||||||
|
sudo rm -rf package/runner/BeCyIconGrabber.exe
|
||||||
|
sudo rm -rf package/runner/Icon
|
||||||
|
sudo rm -rf package/runner/RegShot.exe
|
||||||
|
sudo rm -rf package/runner/novnc
|
||||||
|
# 修复 which 命令的问题导致无法正常识别终端的问题
|
||||||
|
cp deep-wine-runner/off-line-shell/run.sh package -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/run-system-bwrap.sh package -rv
|
||||||
|
cp deep-wine-runner/off-line-shell/bwrap_loongarch64 package/bwrap -rv
|
||||||
|
sudo chmod 777 -Rv package ; true
|
||||||
|
cd package
|
||||||
|
# 添加 Wine 运行器离线模式标识
|
||||||
|
touch runner/off-line.lock
|
||||||
|
tar -cvf ../spark-deepin-wine-runner-off-line.tar *
|
||||||
|
cd ..
|
||||||
|
xz -T $cpu spark-deepin-wine-runner-off-line.tar
|
||||||
|
- name: upload result
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: spark-deepin-wine-runner-off-line-loongarch64.tar.xz
|
||||||
|
path: /home/runner/spark-deepin-wine-runner-off-line.tar.xz
|
||||||
|
|
||||||
|
|
||||||
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
|||||||
[submodule "novnc"]
|
|
||||||
path = novnc
|
|
||||||
url = https://github.com/novnc/noVNC
|
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#################
|
#################
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import globalenv
|
||||||
import traceback
|
import traceback
|
||||||
import updatekiller
|
import updatekiller
|
||||||
import PyQt5.QtGui as QtGui
|
import PyQt5.QtGui as QtGui
|
||||||
@@ -101,7 +102,10 @@ homePath = os.getenv("HOME")
|
|||||||
iconPath = "{}/deepin-wine-runner.svg".format(programPath)
|
iconPath = "{}/deepin-wine-runner.svg".format(programPath)
|
||||||
#GetDesktopList(f"{homePath}/.local/share/applications")
|
#GetDesktopList(f"{homePath}/.local/share/applications")
|
||||||
#print(desktopList)
|
#print(desktopList)
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
if (__name__ == "__main__"):
|
||||||
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
|
else:
|
||||||
|
app = globalenv.get_value("app")
|
||||||
window = QtWidgets.QMainWindow()
|
window = QtWidgets.QMainWindow()
|
||||||
widget = QtWidgets.QWidget()
|
widget = QtWidgets.QWidget()
|
||||||
layout = QtWidgets.QGridLayout()
|
layout = QtWidgets.QGridLayout()
|
||||||
@@ -118,6 +122,7 @@ window.setCentralWidget(widget)
|
|||||||
window.setWindowTitle("图标管理")
|
window.setWindowTitle("图标管理")
|
||||||
window.resize(int(window.frameGeometry().width() * 1.5), int(window.frameGeometry().height() * 1.2))
|
window.resize(int(window.frameGeometry().width() * 1.5), int(window.frameGeometry().height() * 1.2))
|
||||||
window.setWindowIcon(QtGui.QIcon(f"{programPath}/deepin-wine-runner.svg"))
|
window.setWindowIcon(QtGui.QIcon(f"{programPath}/deepin-wine-runner.svg"))
|
||||||
window.show()
|
|
||||||
GetDesktopThread()
|
GetDesktopThread()
|
||||||
app.exec_()
|
if (__name__ == "__main__"):
|
||||||
|
window.show()
|
||||||
|
app.exec_()
|
||||||
0
ConfigLanguareRunner-help.json
Normal file → Executable file
0
DefaultSetting.py
Normal file → Executable file
@@ -4,7 +4,7 @@ X-Categories=System;Wine;
|
|||||||
Exec=/usr/bin/deepin-wine-runner %F
|
Exec=/usr/bin/deepin-wine-runner %F
|
||||||
Icon=/opt/apps/deepin-wine-runner/deepin-wine-runner.svg
|
Icon=/opt/apps/deepin-wine-runner/deepin-wine-runner.svg
|
||||||
Name=Wine Runner
|
Name=Wine Runner
|
||||||
Name[zh]=Wine 运行器
|
Name[zh_CN]=Wine 运行器
|
||||||
Terminal=false
|
Terminal=false
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
Keywords=exe;scr;
|
Keywords=exe;scr;
|
||||||
|
|||||||
0
DisabledOpengl.reg
Normal file → Executable file
6
Download.py
Normal file → Executable file
@@ -8,4 +8,8 @@ import requests
|
|||||||
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
||||||
with open(f"{programPath}/information.json") as file:
|
with open(f"{programPath}/information.json") as file:
|
||||||
version = json.loads(file.read())["Version"]
|
version = json.loads(file.read())["Version"]
|
||||||
print(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9JbnN0YWxsLnBocD9WZXJzaW9uPQ==").decode("utf-8") + version).text)
|
print(requests.get(base64.b64decode("aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZGVlcC13aW5lLXJ1bm5lci13aW5lLWRvd25sb2FkL2ZpbGVzL2Rvd25sb2FkLXRpbWUv").decode("utf-8")
|
||||||
|
+ version
|
||||||
|
+ base64.b64decode("L2Rvd25sb2Fk").decode("utf-8"),
|
||||||
|
timeout=5 # timeout 设置为 5S
|
||||||
|
).text)
|
||||||
0
EnabledOpengl.reg
Normal file → Executable file
0
IconList.json
Normal file → Executable file
0
InstallDeepinWine6OnUbuntu.sh
Normal file → Executable file
0
InstallDeepinWineOnUbuntu.sh
Normal file → Executable file
@@ -12,6 +12,7 @@
|
|||||||
#################
|
#################
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import requests
|
||||||
import updatekiller
|
import updatekiller
|
||||||
import traceback
|
import traceback
|
||||||
try:
|
try:
|
||||||
@@ -56,10 +57,16 @@ try:
|
|||||||
exitInputShow = int(os.getenv("ENTERNOTSHOW"))
|
exitInputShow = int(os.getenv("ENTERNOTSHOW"))
|
||||||
except:
|
except:
|
||||||
exitInputShow = True
|
exitInputShow = True
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/130.0.0.0"
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
# 获取最新版本的版本号
|
# 获取最新版本的版本号
|
||||||
programVersionList = pyquery.PyQuery(url=f"http://mirrors.ustc.edu.cn/wine/wine/wine-{sys.argv[3]}/")
|
data = requests.get(f"http://mirrors.ustc.edu.cn/wine/wine/wine-{sys.argv[3]}/", headers=headers)
|
||||||
|
programVersionList = pyquery.PyQuery(data.text)
|
||||||
except:
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
print("无法连接下载服务器,将使用本地缓存")
|
print("无法连接下载服务器,将使用本地缓存")
|
||||||
if not os.path.exists(f"{homePath}/.cache/deepin-wine-runner/{sys.argv[3]}/install.msi") or not os.path.exists(f"{homePath}/.cache/deepin-wine-runner/{sys.argv[3]}/information.txt"):
|
if not os.path.exists(f"{homePath}/.cache/deepin-wine-runner/{sys.argv[3]}/install.msi") or not os.path.exists(f"{homePath}/.cache/deepin-wine-runner/{sys.argv[3]}/information.txt"):
|
||||||
print("无本地缓存数据,无法进行、结束")
|
print("无本地缓存数据,无法进行、结束")
|
||||||
@@ -75,7 +82,8 @@ except:
|
|||||||
exit()
|
exit()
|
||||||
programVersion = programVersionList("a:last-child").attr.href
|
programVersion = programVersionList("a:last-child").attr.href
|
||||||
# 获取最新版本安装包的URL
|
# 获取最新版本安装包的URL
|
||||||
programUrl = pyquery.PyQuery(url=f"http://mirrors.ustc.edu.cn/wine/wine/wine-{sys.argv[3]}/{programVersion}")
|
data = requests.get(f"http://mirrors.ustc.edu.cn/wine/wine/wine-{sys.argv[3]}/{programVersion}", headers=headers)
|
||||||
|
programUrl = pyquery.PyQuery(data.text)
|
||||||
programDownloadUrl = ""
|
programDownloadUrl = ""
|
||||||
programFileName = ""
|
programFileName = ""
|
||||||
for i in programUrl("a").items():
|
for i in programUrl("a").items():
|
||||||
|
|||||||
81
Makefile
@@ -11,9 +11,6 @@ clean:
|
|||||||
python3 RemovePycacheFile.py
|
python3 RemovePycacheFile.py
|
||||||
rm *.deb -fv
|
rm *.deb -fv
|
||||||
rm *.pkg.tar* -fv
|
rm *.pkg.tar* -fv
|
||||||
cd VM-source ; qmake . ; make clean
|
|
||||||
rm VM-source/VirtualMachine -rfv
|
|
||||||
rm -rfv VM-source/.qmake.stash
|
|
||||||
|
|
||||||
#package-rpm:
|
#package-rpm:
|
||||||
|
|
||||||
@@ -35,21 +32,14 @@ package-pkg:
|
|||||||
sudo debtap -Q spark-deepin-wine-runner-ace.deb
|
sudo debtap -Q spark-deepin-wine-runner-ace.deb
|
||||||
|
|
||||||
copy-files:
|
copy-files:
|
||||||
#cd VM-source && qmake
|
|
||||||
#cd VM-source && make
|
|
||||||
#cd wine && make
|
#cd wine && make
|
||||||
make clean -j$(nproc)
|
make clean -j$(nproc)
|
||||||
mkdir deb/opt/apps/deepin-wine-runner/LANG -pv
|
mkdir deb/opt/apps/deepin-wine-runner/LANG -pv
|
||||||
cp -rv helperset deb/opt/apps/deepin-wine-runner/
|
cp -rv helperset deb/opt/apps/deepin-wine-runner/
|
||||||
#cp -rv VM-source/VirtualMachine VM
|
|
||||||
cp -rv VM-source/deepin-wine-runner.svg VM
|
|
||||||
cp -rv VM-source/Windows7X64Auto.iso VM
|
|
||||||
cp -rv VM-source/Windows7X86Auto.iso VM
|
|
||||||
cp -rv VM-source/test.qcow2 VM
|
|
||||||
cp -rv VM-source/*.fd VM
|
|
||||||
cp -rv wine/ deb/opt/apps/deepin-wine-runner/
|
cp -rv wine/ deb/opt/apps/deepin-wine-runner/
|
||||||
cp -rv Test/ deb/opt/apps/deepin-wine-runner/
|
cp -rv Test/ deb/opt/apps/deepin-wine-runner/
|
||||||
cp -rv dxvk/ deb/opt/apps/deepin-wine-runner
|
cp -rv dxvk/ deb/opt/apps/deepin-wine-runner/
|
||||||
|
cp -rv packager-config/ deb/opt/apps/deepin-wine-runner/
|
||||||
cp -rv information.json package-script
|
cp -rv information.json package-script
|
||||||
zip -v -q -r package-script.zip package-script
|
zip -v -q -r package-script.zip package-script
|
||||||
cp -rv InstallBox86-cn.sh deb/opt/apps/deepin-wine-runner/
|
cp -rv InstallBox86-cn.sh deb/opt/apps/deepin-wine-runner/
|
||||||
@@ -108,7 +98,7 @@ copy-files:
|
|||||||
cp -rv InstallVisualCPlusPlus.py deb/opt/apps/deepin-wine-runner
|
cp -rv InstallVisualCPlusPlus.py deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv launch.sh deb/opt/apps/deepin-wine-runner
|
cp -rv launch.sh deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv LICENSE deb/opt/apps/deepin-wine-runner
|
cp -rv LICENSE deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv mainwindow.py deb/opt/apps/deepin-wine-runner/deepin-wine-runner
|
cp -rv mainwindow.py deb/opt/apps/deepin-wine-runner/
|
||||||
cp -rv package-script.zip deb/opt/apps/deepin-wine-runner
|
cp -rv package-script.zip deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv Run.bat deb/opt/apps/deepin-wine-runner
|
cp -rv Run.bat deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv RunVM.sh deb/opt/apps/deepin-wine-runner
|
cp -rv RunVM.sh deb/opt/apps/deepin-wine-runner
|
||||||
@@ -146,8 +136,12 @@ copy-files:
|
|||||||
cp -rv RemoveQemuUser.sh deb/opt/apps/deepin-wine-runner
|
cp -rv RemoveQemuUser.sh deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv InstallBox86.sh deb/opt/apps/deepin-wine-runner
|
cp -rv InstallBox86.sh deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv InstallRuntime deb/opt/apps/deepin-wine-runner
|
cp -rv InstallRuntime deb/opt/apps/deepin-wine-runner
|
||||||
if [[ ! -d novnc/utils/websockify ]]; then git submodule update --init --recursive ; fi
|
cp -rv globalenv.py deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv novnc deb/opt/apps/deepin-wine-runner
|
cp -rv local deb/opt/apps/deepin-wine-runner
|
||||||
|
cp -rv WindowModule.py deb/opt/apps/deepin-wine-runner
|
||||||
|
cp -rv welcome.py deb/opt/apps/deepin-wine-runner
|
||||||
|
#cp -rv main.py deb/opt/apps/deepin-wine-runner/deepin-wine-runner
|
||||||
|
cp -rv mainwindow.py deb/opt/apps/deepin-wine-runner/deepin-wine-runner
|
||||||
mkdir -pv deb/opt/apps/deepin-wine-runner/entries/
|
mkdir -pv deb/opt/apps/deepin-wine-runner/entries/
|
||||||
cp -rv deb/usr/share/applications deb/opt/apps/deepin-wine-runner/entries/applications
|
cp -rv deb/usr/share/applications deb/opt/apps/deepin-wine-runner/entries/applications
|
||||||
python3 UpdateTime.py
|
python3 UpdateTime.py
|
||||||
@@ -183,8 +177,63 @@ copy-files:
|
|||||||
remove-copy-files:
|
remove-copy-files:
|
||||||
sudo rm -rfv /tmp/spark-deepin-wine-runner-builder
|
sudo rm -rfv /tmp/spark-deepin-wine-runner-builder
|
||||||
|
|
||||||
|
package-deb-to-amd64:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: amd64/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-amd64.deb
|
||||||
|
|
||||||
|
package-deb-to-arm64:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: arm64/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-arm64.deb
|
||||||
|
|
||||||
|
package-deb-to-mips64el:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: mips64el/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-mips64el.deb
|
||||||
|
|
||||||
|
package-deb-to-loongarch64:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: loongarch64/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-loongarch64.deb
|
||||||
|
|
||||||
|
package-deb-to-loong64:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: loong64/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-loong64.deb
|
||||||
|
|
||||||
|
package-deb-to-riscv64:
|
||||||
|
rm -rfv /tmp/wine-runner-package
|
||||||
|
dpkg -x spark-deepin-wine-runner.deb /tmp/wine-runner-package
|
||||||
|
dpkg -e spark-deepin-wine-runner.deb /tmp/wine-runner-package/DEBIAN
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/opt
|
||||||
|
sudo chown -R root:root /tmp/wine-runner-package/usr
|
||||||
|
sed -i "s/Architecture: all/Architecture: riscv64/g" /tmp/wine-runner-package/DEBIAN/control
|
||||||
|
dpkg-deb -Z xz -z 0 -b /tmp/wine-runner-package spark-deepin-wine-runner-riscv64.deb
|
||||||
|
|
||||||
package-deb:
|
package-deb:
|
||||||
make copy-files -j$(nproc)
|
make copy-files -j$(nproc)
|
||||||
|
sudo chown -R root:root /tmp/spark-deepin-wine-runner-builder
|
||||||
dpkg-deb -Z xz -z 9 -b /tmp/spark-deepin-wine-runner-builder spark-deepin-wine-runner.deb
|
dpkg-deb -Z xz -z 9 -b /tmp/spark-deepin-wine-runner-builder spark-deepin-wine-runner.deb
|
||||||
make remove-copy-files -j$(nproc)
|
make remove-copy-files -j$(nproc)
|
||||||
# 构建 ace 包
|
# 构建 ace 包
|
||||||
@@ -214,7 +263,7 @@ package-termux-deb:
|
|||||||
sudo cp -rv deb-termux/usr/share/applications /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/share/applications
|
sudo cp -rv deb-termux/usr/share/applications /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/share/applications
|
||||||
# 加入 termux loader
|
# 加入 termux loader
|
||||||
sudo cp -rv mainwindow-termux-loader.sh /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/opt/apps/deepin-wine-runner/deepin-wine-runner
|
sudo cp -rv mainwindow-termux-loader.sh /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/opt/apps/deepin-wine-runner/deepin-wine-runner
|
||||||
sudo cp -rv mainwindow.py /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/opt/apps/deepin-wine-runner/mainwindow.py
|
sudo cp -rv main.py /tmp/spark-deepin-wine-runner-builder/data/data/com.termux/files/usr/opt/apps/deepin-wine-runner/mainwindow.py
|
||||||
sudo bash builddeb/ChangeDebVersion.sh
|
sudo bash builddeb/ChangeDebVersion.sh
|
||||||
dpkg-deb -Z xz -z 9 -b /tmp/spark-deepin-wine-runner-builder spark-deepin-wine-runner-termux.deb
|
dpkg-deb -Z xz -z 9 -b /tmp/spark-deepin-wine-runner-builder spark-deepin-wine-runner-termux.deb
|
||||||
make remove-copy-files -j$(nproc)
|
make remove-copy-files -j$(nproc)
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
|||||||
# 优先为深度终端
|
# 优先为深度终端
|
||||||
terminal = ""
|
terminal = ""
|
||||||
terminalList = [
|
terminalList = [
|
||||||
|
"gxde-terminal",
|
||||||
"deepin-terminal",
|
"deepin-terminal",
|
||||||
"deepin-terminal-gtk",
|
|
||||||
"mate-terminal",
|
"mate-terminal",
|
||||||
"gnome-terminal",
|
"gnome-terminal",
|
||||||
"xfce4-terminal"
|
"xfce4-terminal"
|
||||||
]
|
]
|
||||||
terminalEnd = {
|
terminalEnd = {
|
||||||
f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0],
|
f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0],
|
||||||
f"{programPath}/../launch.sh\" \"deepin-terminal-gtk": ["-e", 0],
|
"gxde-terminal": ["-e", 0],
|
||||||
"mate-terminal": ["-e", 1],
|
"mate-terminal": ["-e", 1],
|
||||||
"gnome-terminal": ["--", 0],
|
"gnome-terminal": ["--", 0],
|
||||||
"xfce4-terminal": ["-e", 1]
|
"xfce4-terminal": ["-e", 1]
|
||||||
@@ -31,7 +31,7 @@ for i in terminalList:
|
|||||||
if i == "deepin-terminal":
|
if i == "deepin-terminal":
|
||||||
i = f"{programPath}/../launch.sh\" \"deepin-terminal"
|
i = f"{programPath}/../launch.sh\" \"deepin-terminal"
|
||||||
if i == "deepin-terminal-gtk":
|
if i == "deepin-terminal-gtk":
|
||||||
i = f"{programPath}/../launch.sh\" \"deepin-terminal-gtk"
|
i = f"{programPath}/../launch.sh\" \"gxde-terminal"
|
||||||
terminal = i
|
terminal = i
|
||||||
break
|
break
|
||||||
if terminal == "":
|
if terminal == "":
|
||||||
|
|||||||
31
README.md
@@ -27,9 +27,10 @@ Wine Runner is a program that allows Linux users to run Windows applications mor
|
|||||||
|
|
||||||
打包器视频教程:https://www.bilibili.com/video/BV1Bh4y1Q7nT/
|
打包器视频教程:https://www.bilibili.com/video/BV1Bh4y1Q7nT/
|
||||||
Wine 运行器 QQ 交流群:762985460
|
Wine 运行器 QQ 交流群:762985460
|
||||||
Wine 运行器离线包下载地址:https://www.123pan.com/s/pDSKVv-pAJWv.html
|
|
||||||
|
|
||||||
### Wine 运行器 For Termux 安装方法以及注意事项
|
### Wine 运行器 For Termux 安装方法以及注意事项
|
||||||
|
Wine 运行器 For Termux 使用的是独立的安装包,详细见:
|
||||||
见 https://gitee.com/gfdgd-xi/deep-wine-runner-termux
|
见 https://gitee.com/gfdgd-xi/deep-wine-runner-termux
|
||||||
https://github.com/gfdgd-xi/deep-wine-runner-termux
|
https://github.com/gfdgd-xi/deep-wine-runner-termux
|
||||||
|
|
||||||
@@ -57,15 +58,8 @@ https://gfdgdxi.lanzouw.com/b0plly5cj
|
|||||||
spark-deepin-wine-runner 是普通包,spark-deepin-wine-runner-ace 是使用 ace 兼容环境运行的运行器
|
spark-deepin-wine-runner 是普通包,spark-deepin-wine-runner-ace 是使用 ace 兼容环境运行的运行器
|
||||||
|
|
||||||
## Wine 运行器离线包
|
## Wine 运行器离线包
|
||||||
### X86
|
见小黄鱼:
|
||||||
123pan:https://www.123pan.com/s/pDSKVv-pAJWv.html
|
https://m.tb.cn/h.g93KHpR?tk=KPeR3dH09WM
|
||||||
百度网盘:https://pan.baidu.com/s/1klBw63tw2_ZQLzmi11dDBw?pwd=7bu5 提取码: 7bu5
|
|
||||||
诚通网盘:http://ctfile.gfdgdxi.top/d/31540479-59254792-909739?p=2061 (访问密码: 2061)
|
|
||||||
Github:https://github.com/gfdgd-xi/deep-wine-runner/releases/
|
|
||||||
Sourceforge:https://sourceforge.net/projects/deep-wine-runner/files/
|
|
||||||
更多需求需要私聊作者定制(有偿服务)
|
|
||||||
### ARM
|
|
||||||
需要私聊作者定制(有偿服务)
|
|
||||||
|
|
||||||
## 软件架构
|
## 软件架构
|
||||||
理论上支持全架构,如果 Python 能运行的话
|
理论上支持全架构,如果 Python 能运行的话
|
||||||
@@ -163,6 +157,21 @@ desktop文件中StartupWMClass字段。用于让桌面组件将窗口类名与de
|
|||||||

|

|
||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
### 4.1.0(2024/09/15)
|
||||||
|
**※1、修复在 GXDE OS 下无法正常调用 gxde-terminal 的问题**
|
||||||
|
**※2、修复部分机器无法打开应用的问题**
|
||||||
|
**※3、修改打包器 wine 集成封装 机制以便可以被 uos 商店正确签名**
|
||||||
|
**※4、打包器支持内置 spark dwine helper**
|
||||||
|
**※5、重构虚拟机安装模块以支持更多机器**
|
||||||
|
**6、修复打包器设置依赖无法生效的问题**
|
||||||
|
**※7、补充图标**
|
||||||
|
**※8、修复 deb 安装过程中可能出现 dpkg 卡死的问题**
|
||||||
|
**※9、优化 Wine 安装器检测机制**
|
||||||
|
**※10、删除部分废弃组件**
|
||||||
|
**※11、修复 AOSC、Termux 无法正常打开 Wine 运行器的问题**
|
||||||
|
12、修改文案
|
||||||
|
13、修复其它 bug 若干
|
||||||
|
|
||||||
### 4.0.0(2024/07/22)
|
### 4.0.0(2024/07/22)
|
||||||
**※1、优化运行器窗口大小机制**
|
**※1、优化运行器窗口大小机制**
|
||||||
**※2、Wine 安装器支持根据机器实际情况自动推荐适合的 Wine**
|
**※2、Wine 安装器支持根据机器实际情况自动推荐适合的 Wine**
|
||||||
@@ -836,8 +845,6 @@ make install -j4
|
|||||||
## 请作者喝杯茶
|
## 请作者喝杯茶
|
||||||
如果您觉得 Wine 运行器对你有帮助,可以请作者喝杯茶
|
如果您觉得 Wine 运行器对你有帮助,可以请作者喝杯茶
|
||||||
<img src="Icon/QR/Wechat.png" width="250" />
|
<img src="Icon/QR/Wechat.png" width="250" />
|
||||||
<img src="Icon/QR/Alipay.jpg" width="250" />
|
|
||||||
<img src="Icon/QR/QQ.png" width="250" >
|
|
||||||
|
|
||||||
### 广告
|
### 广告
|
||||||
支付宝官方活动,扫描获得支付红包!
|
支付宝官方活动,扫描获得支付红包!
|
||||||
|
|||||||
0
README_en.md
Normal file → Executable file
0
RunCommandWithTerminal.py
Normal file → Executable file
120
ShellList/turn-amd64-to-all.sh
Executable file
@@ -0,0 +1,120 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# A simple loongarch64 => loong64 .deb converter to help traverse the worlds.
|
||||||
|
#
|
||||||
|
# Mingcong Bai <jeffbai@aosc.io>, 2024
|
||||||
|
|
||||||
|
_display_usage() {
|
||||||
|
printf "\
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
loong64-it [PACKAGE1] [PACKAGE2] ...
|
||||||
|
|
||||||
|
- PACKAGE{1..N}: Path to the old-world .deb package to convert.
|
||||||
|
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autobuild-like echo functions.
|
||||||
|
abwarn() { echo -e "[\e[33mWARN\e[0m]: \e[1m$*\e[0m"; }
|
||||||
|
aberr() { echo -e "[\e[31mERROR\e[0m]: \e[1m$*\e[0m"; exit 1; }
|
||||||
|
abinfo() { echo -e "[\e[96mINFO\e[0m]: \e[1m$*\e[0m"; }
|
||||||
|
abdbg() { echo -e "[\e[32mDEBUG\e[0m]: \e[1m$*\e[0m"; }
|
||||||
|
|
||||||
|
_convert_loong64() {
|
||||||
|
PKG_PATH=$(realpath $1)
|
||||||
|
PKG_NAME=$(dpkg-deb -f "$PKG_PATH" Package)
|
||||||
|
VERSION=$(dpkg-deb -f "$PKG_PATH" Version)
|
||||||
|
BASEDIR=$(dirname $PKG_PATH)
|
||||||
|
abinfo "Examining package information: $1 ..."
|
||||||
|
dpkg -I "$PKG_PATH" || \
|
||||||
|
aberr "Invalid dpkg package: control (metadata) archive not found: $?"
|
||||||
|
CONTROL_EXT="$(ar t "$PKG_PATH" | grep control.tar* | cut -f3 -d'.')"
|
||||||
|
case "${CONTROL_EXT}" in
|
||||||
|
gz)
|
||||||
|
TAR_COMP_FLAG="z"
|
||||||
|
;;
|
||||||
|
xz)
|
||||||
|
TAR_COMP_FLAG="J"
|
||||||
|
;;
|
||||||
|
bz2)
|
||||||
|
TAR_COMP_FLAG="j"
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
TAR_COMP_FLAG=""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
aberr "Invalid control archive extension ${CONTROL_EXT}!"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
abinfo "Unpacking: $1 ..."
|
||||||
|
cd $(mktemp -d) || \
|
||||||
|
aberr "Failed to create temporary directory to unpack $1: $?."
|
||||||
|
DEBDIR="$(pwd)"
|
||||||
|
ar xv "$PKG_PATH" || \
|
||||||
|
aberr "Failed to unpack $1: $?."
|
||||||
|
|
||||||
|
abinfo "Unpacking metadata archive: $1 ..."
|
||||||
|
mkdir "$DEBDIR"/metadata || \
|
||||||
|
aberr "Failed to create temporary directory for extracting the metdata archive from $1: $?."
|
||||||
|
tar -C "$DEBDIR"/metadata -xvf control.tar."${CONTROL_EXT}" || \
|
||||||
|
aberr "Failed to unpack metadata archive from $1: $?."
|
||||||
|
|
||||||
|
abinfo "Converting dpkg Architecture key: $1 ..."
|
||||||
|
#if ! egrep '^Architecture: loongarch64$' "$DEBDIR"/metadata/control; then
|
||||||
|
# aberr "Failed to detect a \"loongarch64\" architecture signature in control file - this is not a valid old-world LoongArch package!"
|
||||||
|
#fi
|
||||||
|
sed -e 's|^Architecture: amd64$|Architecture: all|g' \
|
||||||
|
-i "$DEBDIR"/metadata/control
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
abinfo "Building metadata archive (control.tar.${CONTROL_EXT}): $1 ..."
|
||||||
|
cd "$DEBDIR"/metadata
|
||||||
|
tar cvf${TAR_COMP_FLAG} "$DEBDIR"/control.tar."${CONTROL_EXT}" * || \
|
||||||
|
aberr "Failed to build metadata archive (control.tar.${CONTROL_EXT}) for $1: $?."
|
||||||
|
cd "$DEBDIR"
|
||||||
|
|
||||||
|
abinfo "Rebuilding dpkg package $1"
|
||||||
|
ar rv "$PKG_PATH" control.tar.${CONTROL_EXT} || \
|
||||||
|
aberr "Failed to rebuild dpkg package $1: $?."
|
||||||
|
|
||||||
|
#abinfo "Cleaning up: $1 ..."
|
||||||
|
#rm -r "$DEBDIR"
|
||||||
|
mv $1 ${BASEDIR}/${PKG_NAME}_${VERSION}_loong64.deb
|
||||||
|
abinfo """Your requested package:
|
||||||
|
|
||||||
|
$1
|
||||||
|
|
||||||
|
Has been successfully converted as a loong64 package and renamed as ${PKG_NAME}_${VERSION}_loong64.deb
|
||||||
|
|
||||||
|
However, you may still need to install libLoL for old-world applications to
|
||||||
|
work properly. Please refer to the libLoL home page:
|
||||||
|
|
||||||
|
https://liblol.aosc.io
|
||||||
|
|
||||||
|
For details on how to install and configure libLoL.
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display usage info if `-h' or `--help' is specified.
|
||||||
|
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
|
||||||
|
_display_usage
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Display usage info with directions if no option is specified.
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
abwarn "Please specify package(s) to convert.\n"
|
||||||
|
_display_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Record working directory.
|
||||||
|
SRCDIR="$(pwd)"
|
||||||
|
|
||||||
|
# Rebuilding all requested packages.
|
||||||
|
for i in "$@"; do
|
||||||
|
_convert_loong64 $i
|
||||||
|
done
|
||||||
27
StartVM.sh
@@ -62,17 +62,18 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
qemuUEFI="-vga virtio -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 "
|
qemuUEFI="-vga virtio -machine usb=on -device usb-tablet "
|
||||||
fi
|
fi
|
||||||
echo $qemuUEFI
|
echo $qemuUEFI
|
||||||
./VM/kvm-ok
|
./VM/kvm-ok
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "x86_64" ]]; then
|
if [[ $? == 0 ]] && [[ `arch` == "x86_64" ]]; then
|
||||||
echo X86 架构,使用 kvm 加速
|
echo X86 架构,使用 kvm 加速
|
||||||
$qemuMore qemu-system-x86_64 --enable-kvm -cpu host --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuMore qemu-system-x86_64 --enable-kvm -name Wine运行器虚拟机工具 -cpu host --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -nic model=rtl8139 $qemuUEFI \
|
||||||
-device AC97 -device ES1370 -device intel-hda -device hda-duplex \
|
-device AC97 -device ES1370 -device intel-hda -device hda-duplex \
|
||||||
--boot 'splash=VM/boot.jpg,menu=on,splash-time=2000' \
|
--boot 'splash=VM/boot.jpg,menu=on,splash-time=2000' \
|
||||||
|
-usb \
|
||||||
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
@@ -93,13 +94,13 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
qemuPath="bwrap --dev-bind / / --bind ./VM/MipsQemu/usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so /usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so ./VM/MipsQemu/usr/bin/qemu-system-x86_64"
|
qemuPath="bwrap --dev-bind / / --bind ./VM/MipsQemu/usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so /usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so ./VM/MipsQemu/usr/bin/qemu-system-x86_64"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [[ $qemuMore != "" ]]; then
|
if [[ $qemuMore == "" ]]; then
|
||||||
qemuPath=$qemuMore
|
qemuPath=$qemuMore
|
||||||
fi
|
fi
|
||||||
echo 不使用 kvm 加速
|
echo 不使用 kvm 加速
|
||||||
$qemuPath --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuPath --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -nic model=rtl8139 $qemuUEFI \
|
||||||
-device AC97 -device ES1370 -device intel-hda -device hda-duplex \
|
-device AC97 -device ES1370 -device intel-hda -device hda-duplex \
|
||||||
--boot 'splash=VM/boot.jpg,menu=on,splash-time=2000' \
|
--boot 'splash=VM/boot.jpg,menu=on,splash-time=2000' \
|
||||||
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
||||||
@@ -119,9 +120,9 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
echo $qemuUEFI
|
echo $qemuUEFI
|
||||||
./VM/kvm-ok
|
./VM/kvm-ok
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
||||||
$qemuMore qemu-system-arm --enable-kvm --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuMore qemu-system-arm --enable-kvm -name Wine运行器虚拟机工具 --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
||||||
-cpu max -M virt -device virtio-gpu-pci \
|
-cpu max -M virt -device virtio-gpu-pci \
|
||||||
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
||||||
-device usb-tablet,id=tablet,bus=xhci.0,port=1 \
|
-device usb-tablet,id=tablet,bus=xhci.0,port=1 \
|
||||||
@@ -131,9 +132,9 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
$qemuMore qemu-system-arm --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuMore qemu-system-arm -name Wine运行器虚拟机工具 --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
||||||
-cpu max -M virt -device virtio-gpu-pci \
|
-cpu max -M virt -device virtio-gpu-pci \
|
||||||
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
||||||
-device usb-tablet,id=tablet,bus=xhci.0,port=1 \
|
-device usb-tablet,id=tablet,bus=xhci.0,port=1 \
|
||||||
@@ -157,9 +158,9 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
echo $qemuUEFI
|
echo $qemuUEFI
|
||||||
./VM/kvm-ok
|
./VM/kvm-ok
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
||||||
$qemuMore qemu-system-aarch64 --enable-kvm --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuMore qemu-system-aarch64 --enable-kvm -name Wine运行器虚拟机工具 --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
||||||
-cpu max -M virt \
|
-cpu max -M virt \
|
||||||
-device virtio-gpu-pci \
|
-device virtio-gpu-pci \
|
||||||
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
||||||
@@ -170,9 +171,9 @@ if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|||||||
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
> $TMPDIR/tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1 # 最新的 qemu 已经移除参数 -soundhw all
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
$qemuMore qemu-system-aarch64 --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
$qemuMore qemu-system-aarch64 -name Wine运行器虚拟机工具 --hda "$HOME/Qemu/Windows/Windows.qcow2" \
|
||||||
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
-smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) \
|
||||||
-m ${use}G -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
-m ${use}G -display gtk -usb -nic model=rtl8139 $qemuUEFI \
|
||||||
-cpu max -M virt \
|
-cpu max -M virt \
|
||||||
-device virtio-gpu-pci \
|
-device virtio-gpu-pci \
|
||||||
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
-device nec-usb-xhci,id=xhci,addr=0x1b \
|
||||||
|
|||||||
0
UpdateTime.py
Normal file → Executable file
1
VM-source/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
*.user*
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
windows-virtual-machine-installer-for-wine-runner.gfdgdxi.top
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
|
||||||
<settings pass="windowsPE">
|
|
||||||
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<SetupUILanguage>
|
|
||||||
<UILanguage>zh-CN</UILanguage>
|
|
||||||
</SetupUILanguage>
|
|
||||||
<InputLocale>zh-CN</InputLocale>
|
|
||||||
<SystemLocale>zh-CN</SystemLocale>
|
|
||||||
<UILanguage>zh-CN</UILanguage>
|
|
||||||
<UserLocale>zh-CN</UserLocale>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<UserData>
|
|
||||||
<ProductKey>
|
|
||||||
<Key />
|
|
||||||
</ProductKey>
|
|
||||||
<AcceptEula>true</AcceptEula>
|
|
||||||
</UserData>
|
|
||||||
<ImageInstall>
|
|
||||||
<OSImage>
|
|
||||||
<InstallFrom>
|
|
||||||
<MetaData wcm:action="add">
|
|
||||||
<Key>/image/index</Key>
|
|
||||||
<Value>4</Value>
|
|
||||||
</MetaData>
|
|
||||||
</InstallFrom>
|
|
||||||
<InstallTo>
|
|
||||||
<DiskID>0</DiskID>
|
|
||||||
<PartitionID>1</PartitionID>
|
|
||||||
</InstallTo>
|
|
||||||
</OSImage>
|
|
||||||
</ImageInstall>
|
|
||||||
<DiskConfiguration>
|
|
||||||
<Disk wcm:action="add">
|
|
||||||
<CreatePartitions>
|
|
||||||
<CreatePartition wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<Size>130000</Size>
|
|
||||||
<Type>Primary</Type>
|
|
||||||
</CreatePartition>
|
|
||||||
</CreatePartitions>
|
|
||||||
<DiskID>0</DiskID>
|
|
||||||
<WillWipeDisk>true</WillWipeDisk>
|
|
||||||
<ModifyPartitions>
|
|
||||||
<ModifyPartition wcm:action="add">
|
|
||||||
<Active>true</Active>
|
|
||||||
<Extend>false</Extend>
|
|
||||||
<Format>NTFS</Format>
|
|
||||||
<Label>OS</Label>
|
|
||||||
<Letter>C</Letter>
|
|
||||||
<Order>1</Order>
|
|
||||||
<PartitionID>1</PartitionID>
|
|
||||||
</ModifyPartition>
|
|
||||||
</ModifyPartitions>
|
|
||||||
</Disk>
|
|
||||||
</DiskConfiguration>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<UserAccounts>
|
|
||||||
<LocalAccounts>
|
|
||||||
<LocalAccount wcm:action="add">
|
|
||||||
<Password>
|
|
||||||
<Value>UABhAHMAcwB3AG8AcgBkAA==</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</Password>
|
|
||||||
<DisplayName>Windows</DisplayName>
|
|
||||||
<Group>Administrators</Group>
|
|
||||||
<Name>Windows</Name>
|
|
||||||
</LocalAccount>
|
|
||||||
</LocalAccounts>
|
|
||||||
</UserAccounts>
|
|
||||||
<OOBE>
|
|
||||||
<NetworkLocation>Work</NetworkLocation>
|
|
||||||
<ProtectYourPC>3</ProtectYourPC>
|
|
||||||
</OOBE>
|
|
||||||
<TimeZone>China Standard Time</TimeZone>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<ComputerName>*</ComputerName>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<cpi:offlineImage cpi:source="wim:d:/sources/install.wim#Windows 7 ULTIMATE" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
|
|
||||||
</unattend>
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
|
||||||
<settings pass="windowsPE">
|
|
||||||
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<SetupUILanguage>
|
|
||||||
<UILanguage>zh-CN</UILanguage>
|
|
||||||
</SetupUILanguage>
|
|
||||||
<InputLocale>zh-CN</InputLocale>
|
|
||||||
<SystemLocale>zh-CN</SystemLocale>
|
|
||||||
<UILanguage>zh-CN</UILanguage>
|
|
||||||
<UserLocale>zh-CN</UserLocale>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<UserData>
|
|
||||||
<AcceptEula>true</AcceptEula>
|
|
||||||
</UserData>
|
|
||||||
<ImageInstall>
|
|
||||||
<OSImage>
|
|
||||||
<InstallFrom>
|
|
||||||
<MetaData wcm:action="add">
|
|
||||||
<Value>5</Value>
|
|
||||||
<Key>/image/index</Key>
|
|
||||||
</MetaData>
|
|
||||||
</InstallFrom>
|
|
||||||
<InstallTo>
|
|
||||||
<DiskID>0</DiskID>
|
|
||||||
<PartitionID>1</PartitionID>
|
|
||||||
</InstallTo>
|
|
||||||
</OSImage>
|
|
||||||
</ImageInstall>
|
|
||||||
<DiskConfiguration>
|
|
||||||
<Disk wcm:action="add">
|
|
||||||
<CreatePartitions>
|
|
||||||
<CreatePartition wcm:action="add">
|
|
||||||
<Type>Primary</Type>
|
|
||||||
<Order>1</Order>
|
|
||||||
<Size>130000</Size>
|
|
||||||
</CreatePartition>
|
|
||||||
</CreatePartitions>
|
|
||||||
<WillWipeDisk>true</WillWipeDisk>
|
|
||||||
<DiskID>0</DiskID>
|
|
||||||
<ModifyPartitions>
|
|
||||||
<ModifyPartition wcm:action="add">
|
|
||||||
<Active>true</Active>
|
|
||||||
<Extend>false</Extend>
|
|
||||||
<Format>NTFS</Format>
|
|
||||||
<Label>OS</Label>
|
|
||||||
<Letter>C</Letter>
|
|
||||||
<Order>1</Order>
|
|
||||||
<PartitionID>1</PartitionID>
|
|
||||||
</ModifyPartition>
|
|
||||||
</ModifyPartitions>
|
|
||||||
</Disk>
|
|
||||||
</DiskConfiguration>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<UserAccounts>
|
|
||||||
<LocalAccounts>
|
|
||||||
<LocalAccount wcm:action="add">
|
|
||||||
<Password>
|
|
||||||
<Value>UABhAHMAcwB3AG8AcgBkAA==</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</Password>
|
|
||||||
<DisplayName>Windows</DisplayName>
|
|
||||||
<Group>Administrators</Group>
|
|
||||||
<Name>Windows</Name>
|
|
||||||
</LocalAccount>
|
|
||||||
</LocalAccounts>
|
|
||||||
</UserAccounts>
|
|
||||||
<OOBE>
|
|
||||||
<NetworkLocation>Work</NetworkLocation>
|
|
||||||
<ProtectYourPC>3</ProtectYourPC>
|
|
||||||
</OOBE>
|
|
||||||
<TimeZone>China Standard Time</TimeZone>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<ComputerName>*</ComputerName>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<cpi:offlineImage cpi:source="wim:l:/xiayuhao/system-iso/windows-iso/windows-7/windows-7-sp1-x86/sources/install.wim#Windows 7 ULTIMATE" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
|
|
||||||
</unattend>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[autorun]
|
|
||||||
ICON=icon.ico
|
|
||||||
LABEL=<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
|
Before Width: | Height: | Size: 35 KiB |
@@ -1,674 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install qemu-system qemu-user qemu-efi qemu-efi-aarch64 qemu-efi-arm -y
|
|
||||||
sudo apt install qemu-user-static binfmt-support qemu-system-gui -y
|
|
||||||
echo 安装完成!按回车键退出
|
|
||||||
read
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Windows虚拟机安装工具
|
|
||||||
## 介绍
|
|
||||||
基于VirtualBox/Qemu制作的小白Windows虚拟机安装工具,可以做到只需要用户下载系统镜像并点击安装即可,无需顾及虚拟机安装、创建、虚拟机的分区等等
|
|
||||||
此为 Wine 运行器子项目:https://gitee.com/gfdgd-xi/deep-wine-runner
|
|
||||||
依照 GPLV3 协议开源
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 如何使用
|
|
||||||
安装最新版本的 Wine 运行器即可,最新版本的 Wine 运行器自带此安装工具
|
|
||||||
|
|
||||||
## 编译指南
|
|
||||||
```bash
|
|
||||||
git clone https://gitee.com/gfdgd-xi/windows-virtual-machine-installer-for-wine-runner.git
|
|
||||||
cd windows-virtual-machine-installer-for-wine-runner
|
|
||||||
qmake .
|
|
||||||
make -j4
|
|
||||||
```
|
|
||||||
## 预编译版本
|
|
||||||
https://gitee.com/gfdgd-xi/deep-wine-runner/tree/main/VM
|
|
||||||
|
|
||||||
# ©2020~2023 gfdgd xi
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 使用系统默认的 bash 运行
|
|
||||||
###########################################################################################
|
|
||||||
# 作者:gfdgd xi
|
|
||||||
# 版本:1.7.0
|
|
||||||
# 更新时间:2022年07月15日
|
|
||||||
# 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序
|
|
||||||
# 基于 Python3 的 tkinter 构建
|
|
||||||
###########################################################################################
|
|
||||||
cd `dirname $0`
|
|
||||||
VBoxManage showvminfo Windows
|
|
||||||
if [[ 0 == $? ]]; then
|
|
||||||
# 检测到虚拟机存在,启动虚拟机
|
|
||||||
VBoxManage startvm Windows > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
# 检查是否有 QEMU
|
|
||||||
which qemu-system-x86_64
|
|
||||||
if [[ $? == 0 ]] && [[ -f "$HOME/Qemu/Windows/Windows.qcow2" ]]; then
|
|
||||||
if [[ -f "$HOME/.config/deepin-wine-runner/QemuSetting.json" ]]; then
|
|
||||||
echo 有设置文件,读设置文件
|
|
||||||
cd `dirname $0`
|
|
||||||
python3 ./VM/StartQemu.py
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
# 查看CPU个数
|
|
||||||
CpuSocketNum=`cat /proc/cpuinfo | grep "cpu cores" | uniq | wc -l`
|
|
||||||
# 查看CPU核心数
|
|
||||||
CpuCoreNum=`grep 'core id' /proc/cpuinfo | sort -u | wc -l`
|
|
||||||
# 查看逻辑CPU的个数
|
|
||||||
CpuCount=`cat /proc/cpuinfo| grep "processor"| wc -l`
|
|
||||||
|
|
||||||
# 总内存大小GB
|
|
||||||
MemTotal=`awk '($1 == "MemTotal:"){printf "%.2f\n",$2/1024/1024}' /proc/meminfo`
|
|
||||||
use=$(echo "scale=4; $MemTotal / 3" | bc)
|
|
||||||
|
|
||||||
cat ~/.config/deepin-wine-runner/QEMU-ARCH | grep amd64
|
|
||||||
if [[ $? == 0 ]] || [[ ! -e ~/.config/deepin-wine-runner/QEMU-ARCH ]]; then
|
|
||||||
# amd64 架构
|
|
||||||
if [[ -f $HOME/.config/deepin-wine-runner/QEMU-EFI ]]; then
|
|
||||||
echo 使用 UEFI 启动
|
|
||||||
if [[ -f /usr/share/qemu/OVMF.fd ]]; then
|
|
||||||
qemuUEFI="--bios /usr/share/qemu/OVMF.fd"
|
|
||||||
else
|
|
||||||
if [[ -f `dirname $0`/VM/OVMF.fd ]]; then
|
|
||||||
qemuUEFI="--bios `dirname $0`/VM/OVMF.fd"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo $qemuUEFI
|
|
||||||
fi
|
|
||||||
./VM/kvm-ok
|
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "x86_64" ]]; then
|
|
||||||
echo X86 架构,使用 kvm 加速
|
|
||||||
qemu-system-x86_64 --enable-kvm -cpu host --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
echo 不使用 kvm 加速
|
|
||||||
qemu-system-x86_64 --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
cat ~/.config/deepin-wine-runner/QEMU-ARCH | grep armhf
|
|
||||||
if [[ $? == 0 ]]; then
|
|
||||||
# armhf 架构
|
|
||||||
# 寻找 UEFI 固件
|
|
||||||
if [[ -f /usr/share/AAVMF/AAVMF32_CODE.fd ]]; then
|
|
||||||
qemuUEFI="--bios /usr/share/AAVMF/AAVMF32_CODE.fd"
|
|
||||||
else
|
|
||||||
if [[ -f ./VM/AAVMF32_CODE.fd ]]; then
|
|
||||||
qemuUEFI="--bios ./VM/AAVMF32_CODE.fd"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo $qemuUEFI
|
|
||||||
./VM/kvm-ok
|
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
|
||||||
qemu-system-arm --enable-kvm --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI -cpu max -M virt -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
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
qemu-system-arm --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI -cpu max -M virt -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
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
cat ~/.config/deepin-wine-runner/QEMU-ARCH | grep aarch64
|
|
||||||
if [[ $? == 0 ]]; then
|
|
||||||
# aarch64 架构
|
|
||||||
# 寻找 UEFI 固件
|
|
||||||
if [[ -f /usr/share/qemu-efi-aarch64/QEMU_EFI.fd ]]; then
|
|
||||||
qemuUEFI="--bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd"
|
|
||||||
else
|
|
||||||
if [[ -f ./VM/QEMU_AARCH64_EFI.fd ]]; then
|
|
||||||
qemuUEFI="--bios ./VM/QEMU_AARCH64_EFI.fd"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo $qemuUEFI
|
|
||||||
./VM/kvm-ok
|
|
||||||
if [[ $? == 0 ]] && [[ `arch` == "aarch64" ]]; then
|
|
||||||
qemu-system-aarch64 --enable-kvm --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI -cpu max -M virt -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
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
qemu-system-aarch64 --hda "$HOME/Qemu/Windows/Windows.qcow2" -soundhw all -smp $CpuCount,sockets=$CpuSocketNum,cores=$(($CpuCoreNum / $CpuSocketNum)),threads=$(($CpuCount / $CpuCoreNum / $CpuSocketNum)) -m ${use}G -net user,hostfwd=tcp::3389-:3389 -display vnc=:5 -display gtk -usb -nic model=rtl8139 $qemuUEFI -cpu max -M virt -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
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
zenity --question --no-wrap --text="检查到您未创建所指定的虚拟机,是否创建虚拟机并继续?\n如果不创建将无法使用"
|
|
||||||
if [[ 1 == $? ]]; then
|
|
||||||
# 用户不想创建虚拟机,结束
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
./VM/VirtualMachine
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
#-------------------------------------------------
|
|
||||||
#
|
|
||||||
# Project created by QtCreator 2022-07-12T13:39:19
|
|
||||||
#
|
|
||||||
#-------------------------------------------------
|
|
||||||
|
|
||||||
QT += core gui
|
|
||||||
TRANSLATIONS += zh_CN.ts\
|
|
||||||
en_US.ts
|
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
|
||||||
|
|
||||||
TARGET = VirtualMachine
|
|
||||||
TEMPLATE = app
|
|
||||||
QT += network
|
|
||||||
|
|
||||||
# The following define makes your compiler emit warnings if you use
|
|
||||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
|
||||||
# depend on your compiler). Please consult the documentation of the
|
|
||||||
# deprecated API in order to know how to port your code away from it.
|
|
||||||
DEFINES += QT_DEPRECATED_WARNINGS
|
|
||||||
|
|
||||||
# You can also make your code fail to compile if you use deprecated APIs.
|
|
||||||
# In order to do so, uncomment the following line.
|
|
||||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
|
||||||
|
|
||||||
CONFIG += c++11
|
|
||||||
|
|
||||||
SOURCES += \
|
|
||||||
main.cpp \
|
|
||||||
mainwindow.cpp \
|
|
||||||
buildvbox.cpp \
|
|
||||||
vbox.cpp \
|
|
||||||
command.cpp \
|
|
||||||
infoutils.cpp \
|
|
||||||
qemu.cpp \
|
|
||||||
qemusetting.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
|
||||||
mainwindow.h \
|
|
||||||
buildvbox.h \
|
|
||||||
vbox.h \
|
|
||||||
command.h \
|
|
||||||
infoutils.h \
|
|
||||||
qemu.h \
|
|
||||||
qemusetting.h
|
|
||||||
|
|
||||||
FORMS += \
|
|
||||||
mainwindow.ui \
|
|
||||||
qemusetting.ui
|
|
||||||
|
|
||||||
# Default rules for deployment.
|
|
||||||
qnx: target.path = /tmp/$${TARGET}/bin
|
|
||||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
|
||||||
!isEmpty(target.path): INSTALLS += target
|
|
||||||
|
|
||||||
RESOURCES += \
|
|
||||||
trans.qrc \
|
|
||||||
图标.qrc
|
|
||||||
|
|
||||||
DISTFILES += \
|
|
||||||
en_US.qm \
|
|
||||||
en_US.ts
|
|
||||||
|
|
||||||
# 编译时拷贝所需文件
|
|
||||||
file_need.files += Windows7X64Auto.iso \
|
|
||||||
Windows7X86Auto.iso \
|
|
||||||
kvm-ok \
|
|
||||||
AAVMF32_CODE.fd \
|
|
||||||
deepin-wine-runner.svg \
|
|
||||||
OVMF.fd \
|
|
||||||
QEMU_AARCH64_EFI.fd \
|
|
||||||
QEMU_EFI_LOONG64_7.1.fd \
|
|
||||||
test.qcow2
|
|
||||||
file_need.path += $$OUT_PWD
|
|
||||||
COPIES += file_need
|
|
||||||
system(chmod 777 $$OUT_PWD/kvm-ok)
|
|
||||||
@@ -1,347 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 9.0.2, 2024-06-01T15:39:37. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{4ffd6df9-1365-4837-81b1-582e0e2d1f21}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="qlonglong">0</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
|
||||||
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
|
||||||
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
|
||||||
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
|
||||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
|
|
||||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
|
||||||
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.BuildSystem</value>
|
|
||||||
<valuemap type="QVariantMap" key="ClangTools">
|
|
||||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
|
||||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
|
||||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
|
||||||
<value type="int" key="ClangTools.ParallelJobs">2</value>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
|
||||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="DeviceType">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">桌面</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">桌面</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{b17c65ba-6912-41bf-b5c1-4c7446f6c967}</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="int" key="EnableQmlDebugging">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Release</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="int" key="QtQuickCompiler">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
|
||||||
<value type="int" key="EnableQmlDebugging">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Profile</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Profile</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="int" key="QtQuickCompiler">0</value>
|
|
||||||
<value type="int" key="SeparateDebugInfo">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.1</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="DeviceType">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ab20853c-9d79-473a-820e-8e95c145170e}</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/building/deep-wine-runner/VM-source</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/building/deep-wine-runner/VM-source</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="qlonglong">2</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@@ -1,214 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 4.8.2, 2023-07-12T19:05:39. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{4ffd6df9-1365-4837-81b1-582e0e2d1f21}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="int">0</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
|
|
||||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ab20853c-9d79-473a-820e-8e95c145170e}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
|
||||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
|
||||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
|
||||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
|
||||||
<value type="int">0</value>
|
|
||||||
<value type="int">1</value>
|
|
||||||
<value type="int">2</value>
|
|
||||||
<value type="int">3</value>
|
|
||||||
<value type="int">4</value>
|
|
||||||
<value type="int">5</value>
|
|
||||||
<value type="int">6</value>
|
|
||||||
<value type="int">7</value>
|
|
||||||
<value type="int">8</value>
|
|
||||||
<value type="int">9</value>
|
|
||||||
<value type="int">10</value>
|
|
||||||
<value type="int">11</value>
|
|
||||||
<value type="int">12</value>
|
|
||||||
<value type="int">13</value>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">VirtualMachine</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
|
||||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="int">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">20</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">20</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@@ -1,347 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 7.0.1, 2023-11-07T19:30:53. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{4ffd6df9-1365-4837-81b1-582e0e2d1f21}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="int">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
|
||||||
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
|
||||||
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
|
||||||
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
|
||||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
|
|
||||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
|
||||||
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.BuildSystem</value>
|
|
||||||
<valuemap type="QVariantMap" key="ClangTools">
|
|
||||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
|
||||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
|
||||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
|
||||||
<value type="int" key="ClangTools.ParallelJobs">2</value>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
|
||||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="DeviceType">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.15.6 in PATH (qt5)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ab20853c-9d79-473a-820e-8e95c145170e}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/building/deep-wine-runner/VM-source</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/building/deep-wine-runner/VM-source</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/gfdgd_xi/Desktop/building/deep-wine-runner/VM-source</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.1</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="DeviceType">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">桌面</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">桌面</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{b17c65ba-6912-41bf-b5c1-4c7446f6c967}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="int" key="EnableQmlDebugging">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Release</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="int" key="QtQuickCompiler">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
|
||||||
<value type="int" key="EnableQmlDebugging">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Profile</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/gfdgd_xi/Desktop/deep-wine-runner/build-VirtualMachine-unknown-Profile</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="int" key="QtQuickCompiler">0</value>
|
|
||||||
<value type="int" key="SeparateDebugInfo">0</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/gfdgd_xi/Desktop/deep-wine-runner/VM-source/VirtualMachine.pro</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/gfdgd_xi/Desktop/build-VirtualMachine-unknown-Debug</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="int">2</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
################################################
|
|
||||||
# 作者:gfdgd xi
|
|
||||||
# 版本:1.0
|
|
||||||
# 依照 GPL V3 协议开源
|
|
||||||
################################################
|
|
||||||
# 参考文献:
|
|
||||||
# https://juejin.cn/post/7080484519328874510
|
|
||||||
################################################
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
homePath = os.path.expanduser('~')
|
|
||||||
programPath = os.path.split(os.path.realpath(__file__))[0]
|
|
||||||
|
|
||||||
class File:
|
|
||||||
def __init__(self, path) -> None:
|
|
||||||
self.path = path
|
|
||||||
|
|
||||||
def getFileFolderSize(self):
|
|
||||||
"""get size for file or folder"""
|
|
||||||
totalSize = 0
|
|
||||||
if not os.path.exists(self.path):
|
|
||||||
return totalSize
|
|
||||||
if os.path.isfile(self.path):
|
|
||||||
totalSize = os.path.getsize(self.path) # 5041481
|
|
||||||
return totalSize
|
|
||||||
if os.path.isdir(self.path):
|
|
||||||
with os.scandir(self.path) as dirEntryList:
|
|
||||||
for curSubEntry in dirEntryList:
|
|
||||||
curSubEntryFullPath = os.path.join(self.path, curSubEntry.name)
|
|
||||||
if curSubEntry.is_dir():
|
|
||||||
curSubFolderSize = self.path(curSubEntryFullPath) # 5800007
|
|
||||||
totalSize += curSubFolderSize
|
|
||||||
elif curSubEntry.is_file():
|
|
||||||
curSubFileSize = os.path.getsize(curSubEntryFullPath) # 1891
|
|
||||||
totalSize += curSubFileSize
|
|
||||||
return totalSize
|
|
||||||
|
|
||||||
class Manager:
|
|
||||||
def __init__(self, name: str, managerPath: str="VBoxManage") -> None:
|
|
||||||
self.name = name
|
|
||||||
self.managerPath = managerPath
|
|
||||||
self.vboxVersion = subprocess.getoutput(f"\"{self.managerPath}\" -v")
|
|
||||||
|
|
||||||
def Create(self, type: str="Windows7") -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" createvm --name \"{self.name}\" --ostype \"{type}\" --register")
|
|
||||||
|
|
||||||
def CreateDisk(self, path: str, size: int) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" createvdi --filename \"{path}\" --size \"{size}\"")
|
|
||||||
|
|
||||||
def CreateDiskControl(self, controlName: str="storage_controller_1") -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" storagectl \"{self.name}\" --name \"{controlName}\" --add ide")
|
|
||||||
|
|
||||||
def MountDisk(self, diskPath: str, controlName: str="storage_controller_1", port: int=0, device: int=0) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" storageattach \"{self.name}\" --storagectl \"{controlName}\" --type hdd --port {port} --device {device} --medium \"{diskPath}\"")
|
|
||||||
|
|
||||||
def MountISO(self, isoPath: str, controlName: str="storage_controller_1", port: int=1, device: int=0) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" storageattach \"{self.name}\" --storagectl \"{controlName}\" --type dvddrive --port {port} --device {device} --medium \"{isoPath}\"")
|
|
||||||
|
|
||||||
def BootFirst(self, bootDrive: str) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --boot1 {bootDrive}")
|
|
||||||
|
|
||||||
def SetNetBridge(self, netDriver: str) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --nic1 bridged --cableconnected1 on --nictype1 82540EM --bridgeadapter1 \"{netDriver}\" --intnet1 brigh1 --macaddress1 auto")
|
|
||||||
#os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --nic1 hostif")
|
|
||||||
pass
|
|
||||||
|
|
||||||
def SetCPU(self, number: int) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --cpus {number}")
|
|
||||||
|
|
||||||
def SetMemory(self, memory: int) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --memory {memory}")
|
|
||||||
|
|
||||||
def SetRemote(self, setting: bool) -> None:
|
|
||||||
if setting:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrde on")
|
|
||||||
return
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrde off")
|
|
||||||
|
|
||||||
def SetRemoteConnectSetting(self, port: int=5540) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrdeport {port} --vrdeaddress """)
|
|
||||||
|
|
||||||
def Start(self, unShown: bool = False) -> None:
|
|
||||||
if unShown:
|
|
||||||
os.system(f"\"{self.managerPath}\" startvm \"{self.name}\" -type headless")
|
|
||||||
return
|
|
||||||
os.system(f"\"{self.managerPath}\" startvm \"{self.name}\"")
|
|
||||||
|
|
||||||
def Stop(self) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" controlvm \"{self.name}\" poweroff")
|
|
||||||
|
|
||||||
def Delete(self) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" unregistervm --delete \"{self.name}\"")
|
|
||||||
|
|
||||||
def SetDisplayMemory(self, memory: int) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vram {memory}")
|
|
||||||
|
|
||||||
def InstallGuessAdditions(self, controlName: str="storage_controller_1", port: int=1, device: int=0) -> None:
|
|
||||||
self.MountISO("/usr/share/virtualbox/VBoxGuestAdditions.iso", controlName, port, device)
|
|
||||||
|
|
||||||
def EnabledAudio(self) -> None:
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --audio pulse --audiocontroller hda --audioin on --audioout on")
|
|
||||||
#os.system("")
|
|
||||||
|
|
||||||
def EnabledClipboardMode(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --clipboard-mode bidirectional")
|
|
||||||
|
|
||||||
def EnabledDraganddrop(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --draganddrop bidirectional")
|
|
||||||
|
|
||||||
def ShareFile(self, name, path):
|
|
||||||
os.system(f"\"{self.managerPath}\" sharedfolder add \"{self.name}\" -name \"{name}\" -hostpath \"{path}\"")
|
|
||||||
|
|
||||||
def SetVBoxSVGA(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --graphicscontroller vboxsvga")
|
|
||||||
|
|
||||||
def SetMousePS2(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --mouse usb")
|
|
||||||
|
|
||||||
def SetKeyboardPS2(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --keyboard usb")
|
|
||||||
|
|
||||||
def OpenUSB(self):
|
|
||||||
os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --usbohci on")
|
|
||||||
pass
|
|
||||||
|
Before Width: | Height: | Size: 44 KiB |
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#cd `dirname $0`
|
|
||||||
bin=$1
|
|
||||||
nasm -f bin $1 -o `basename $1`.bin
|
|
||||||
if [[ $? != 0 ]];then
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
sudo modprobe nbd 8
|
|
||||||
sudo qemu-nbd `dirname $0`/test.qcow2 --connect /dev/nbd0
|
|
||||||
sudo dd if=`basename $1`.bin of=/dev/nbd0
|
|
||||||
sudo qemu-nbd -d /dev/nbd0
|
|
||||||
kvm --hda `dirname $0`/test.qcow2 -rtc base=localtime
|
|
||||||
@@ -1,316 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#include <sys/sysinfo.h>
|
|
||||||
#include "buildvbox.h"
|
|
||||||
#include "vbox.h"
|
|
||||||
#include <QFile>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QNetworkInterface>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <infoutils.h>
|
|
||||||
#include "qemu.h"
|
|
||||||
#include <QProcess>
|
|
||||||
// 懒得用 QThread 了(要继承)
|
|
||||||
#include <thread>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
// 清屏
|
|
||||||
void buildvbox::CleanScreen(){
|
|
||||||
if(QFile::exists("/etc/os-version")){
|
|
||||||
// Unix
|
|
||||||
system("clear");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Windows
|
|
||||||
system("cls");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取 CPU 个数
|
|
||||||
int buildvbox::GetCPUSocket(){
|
|
||||||
// 获取命令返回值
|
|
||||||
QProcess process;
|
|
||||||
process.start("bash", QStringList() << "-c" << "cat /proc/cpuinfo | grep \"cpu cores\" | uniq | wc -l");
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
int value = process.readAllStandardOutput().toInt();
|
|
||||||
process.close();
|
|
||||||
// 判断异常值,例如没挂载 /proc
|
|
||||||
if(value <= 0){
|
|
||||||
value = 1;
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取 CPU 核心数
|
|
||||||
int buildvbox::GetCPUCore(){
|
|
||||||
QProcess process;
|
|
||||||
process.start("bash", QStringList() << "-c" << "grep 'core id' /proc/cpuinfo | sort -u | wc -l");
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
int value = process.readAllStandardOutput().toInt();
|
|
||||||
process.close();
|
|
||||||
// 判断异常值,例如没挂载 /proc
|
|
||||||
if(value <= 0){
|
|
||||||
value = 1;
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString buildvbox::GetNet(){
|
|
||||||
QList<QNetworkInterface> netList = QNetworkInterface::allInterfaces();
|
|
||||||
foreach(QNetworkInterface net, netList){
|
|
||||||
qDebug() << "Device:" << net.name();
|
|
||||||
QList<QNetworkAddressEntry> entryList = net.addressEntries();
|
|
||||||
foreach(QNetworkAddressEntry entry, entryList){
|
|
||||||
QString ip = entry.ip().toString();
|
|
||||||
qDebug() << "IP Address: " << ip;
|
|
||||||
if(ip != "127.0.0.1" && ip != "192.168.250.1" && ip != "::1" && net.name() != "lo"){
|
|
||||||
// 返回网卡名称
|
|
||||||
return net.name();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
int buildvbox::Download(QString url, QString path, QString fileName){
|
|
||||||
return system(("aria2c -x 16 -s 16 -c " + url + " -d " + path + " -o " + fileName).toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
buildvbox::buildvbox(QString isoPath, int id, int vm){
|
|
||||||
QString programPath = QCoreApplication::applicationDirPath();
|
|
||||||
|
|
||||||
QString net = GetNet();
|
|
||||||
qDebug() << "使用网卡:" << net << endl;
|
|
||||||
if(vm == 0){
|
|
||||||
// Qemu
|
|
||||||
qemu vm("Windows");
|
|
||||||
bool setISOAlready = 0;
|
|
||||||
switch (id) {
|
|
||||||
case 0:
|
|
||||||
vm.Create("Windows7");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
vm.Create("Windows7_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
vm.Create("Windows11_64");
|
|
||||||
vm.SetDisplayMemory(128);
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
vm.Create("WindowsXP_32");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
vm.UseArmhfEFI();
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
vm.UseAarch64EFI();
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
vm.CreateDiskControl();
|
|
||||||
//vm.CreateDiskControl("storage_controller_2");
|
|
||||||
if(id == 0 || id == 1) {
|
|
||||||
vm.CreateDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2", 131072);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
vm.CreateDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2", 131072 * 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
//vm.MountDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2");
|
|
||||||
vm.MountMainDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2");
|
|
||||||
if(QFile::exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/resources/virtio-win.iso")) {
|
|
||||||
vm.MountISO("/opt/apps/deepin-wine-runner-qemu-system-extra/files/resources/virtio-win.iso", "storage_controller_2", 1, 3);
|
|
||||||
}
|
|
||||||
if(!setISOAlready){
|
|
||||||
vm.MountISO(isoPath, "storage_controller_1", 0, 1);
|
|
||||||
switch (id) {
|
|
||||||
case 0:
|
|
||||||
if(QFile::exists(programPath + "/Windows7X86Auto.iso")) {
|
|
||||||
vm.MountISO(programPath + "/Windows7X86Auto.iso", "storage_controller_1", 1, 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(QFile::exists(programPath + "/Windows7X64Auto.iso")) {
|
|
||||||
vm.MountISO(programPath + "/Windows7X64Auto.iso", "storage_controller_1", 1, 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
//vm.AutoInstall(isoPath);
|
|
||||||
if(isoPath != ""){
|
|
||||||
vm.MountMainISO(isoPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
vm.SetCPU(get_nprocs(), GetCPUSocket(), GetCPUCore());
|
|
||||||
long memory = 0;
|
|
||||||
long memoryAll = 0;
|
|
||||||
long swap = 0;
|
|
||||||
long swapAll = 0;
|
|
||||||
infoUtils::memoryRate(memory, memoryAll, swap, swapAll);
|
|
||||||
vm.SetMemory(memoryAll / 3 / 1024);
|
|
||||||
vm.SetNetBridge(net);
|
|
||||||
vm.EnabledAudio();
|
|
||||||
vm.EnabledClipboardMode();
|
|
||||||
vm.EnabledDraganddrop();
|
|
||||||
vm.SetVBoxSVGA();
|
|
||||||
vm.SetMousePS2();
|
|
||||||
vm.SetKeyboardPS2();
|
|
||||||
vm.OpenUSB();
|
|
||||||
vm.ShareFile("ROOT", "/");
|
|
||||||
vm.ShareFile("HOME", QDir::homePath());
|
|
||||||
switch(id){
|
|
||||||
case 8:
|
|
||||||
vm.StartArmhf();
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
vm.StartAarch64();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
vm.Start();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(vm == 1){
|
|
||||||
// VirtualBox
|
|
||||||
vbox vm("Windows");
|
|
||||||
bool setISOAlready = 1;
|
|
||||||
switch (id) {
|
|
||||||
case 0:
|
|
||||||
vm.Create("Windows7");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
vm.Create("Windows7_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
vm.Create("Windows11_64");
|
|
||||||
vm.SetDisplayMemory(128);
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
vm.Create("WindowsXP_32");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
vm.Create("WindowsNT_64");
|
|
||||||
vm.SetDisplayMemory(32);
|
|
||||||
vm.EnabledUEFI(true);
|
|
||||||
setISOAlready = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
QDir dir("/home/gfdgd_xi/Qemu/Windows/");
|
|
||||||
dir.mkpath("/home/gfdgd_xi/Qemu/Windows/");
|
|
||||||
vm.CreateDiskControl();
|
|
||||||
//vm.CreateDiskControl("storage_controller_2");
|
|
||||||
if(id == 0 || id == 1) {
|
|
||||||
vm.CreateDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2", 131072);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
vm.CreateDisk(QDir::homePath() + "/Qemu/Windows/Windows.qcow2", 131072 * 5);
|
|
||||||
}
|
|
||||||
vm.MountDisk(QDir::homePath() + "/VirtualBox VMs/Windows/Windows.vdi");
|
|
||||||
if(!setISOAlready){
|
|
||||||
vm.MountISO(isoPath, "storage_controller_1", 0, 1);
|
|
||||||
switch (id) {
|
|
||||||
case 0:
|
|
||||||
if(QFile::exists(programPath + "/Windows7X86Auto.iso")) {
|
|
||||||
vm.MountISO(programPath + "/Windows7X86Auto.iso", "storage_controller_1", 1, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(QFile::exists(programPath + "/Windows7X64Auto.iso")) {
|
|
||||||
vm.MountISO(programPath + "/Windows7X64Auto.iso", "storage_controller_1", 1, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
vm.AutoInstall(isoPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 判断 VirtualBox Guest ISO 是否存在
|
|
||||||
// 在的话直接挂载
|
|
||||||
if(QFile::exists("/usr/share/virtualbox/VBoxGuestAdditions.iso")){
|
|
||||||
vm.MountISO("/usr/share/virtualbox/VBoxGuestAdditions.iso", "storage_controller_1", 1, 1);
|
|
||||||
}
|
|
||||||
// VirtualBox 的 CPU 数量设置方法和 Qemu 不一样
|
|
||||||
vm.SetCPU(GetCPUCore(), GetCPUSocket(), GetCPUCore());
|
|
||||||
long memory = 0;
|
|
||||||
long memoryAll = 0;
|
|
||||||
long swap = 0;
|
|
||||||
long swapAll = 0;
|
|
||||||
infoUtils::memoryRate(memory, memoryAll, swap, swapAll);
|
|
||||||
//memoryRate(memory, memoryAll, swap, swapAll);
|
|
||||||
vm.SetMemory(memoryAll / 3 / 1024);
|
|
||||||
vm.SetNetBridge(net);
|
|
||||||
vm.EnabledAudio();
|
|
||||||
vm.EnabledClipboardMode();
|
|
||||||
vm.EnabledDraganddrop();
|
|
||||||
vm.SetVBoxSVGA();
|
|
||||||
vm.SetMousePS2();
|
|
||||||
vm.SetKeyboardPS2();
|
|
||||||
vm.OpenUSB();
|
|
||||||
vm.ShareFile("ROOT", "/");
|
|
||||||
vm.ShareFile("HOME", QDir::homePath());
|
|
||||||
vm.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#ifndef BUILDVBOX_H
|
|
||||||
#define BUILDVBOX_H
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class buildvbox
|
|
||||||
{
|
|
||||||
// Q_OBJECT
|
|
||||||
public:
|
|
||||||
buildvbox(QString isoPath, int id=0, int vm=0);
|
|
||||||
void CleanScreen();
|
|
||||||
QString GetNet();
|
|
||||||
int Download(QString url, QString path, QString fileName);
|
|
||||||
int GetCPUSocket();
|
|
||||||
int GetCPUCore();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BUILDVBOX_H
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#include "command.h"
|
|
||||||
#include <QProcess>
|
|
||||||
Command::Command()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QString Command::GetCommand(QString command){
|
|
||||||
QProcess process;
|
|
||||||
process.start(command);
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
return QString::fromLocal8Bit(process.readAllStandardOutput());
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#ifndef COMMAND_H
|
|
||||||
#define COMMAND_H
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class Command
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Command();
|
|
||||||
QString GetCommand(QString command);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // COMMAND_H
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,602 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE TS>
|
|
||||||
<TS version="2.1" language="en" sourcelanguage="zh_CN">
|
|
||||||
<context>
|
|
||||||
<name>MainWindow</name>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="14"/>
|
|
||||||
<source>Wine 运行器虚拟机安装工具</source>
|
|
||||||
<translation>Wine Runner Virtual Machine Install Tools</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="32"/>
|
|
||||||
<location filename="mainwindow.ui" line="35"/>
|
|
||||||
<source>设置</source>
|
|
||||||
<translation>Setting</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="43"/>
|
|
||||||
<source>镜像路径:</source>
|
|
||||||
<translation>ISO FilePath:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="50"/>
|
|
||||||
<source>请选择系统镜像</source>
|
|
||||||
<translation>Please choose or input system image</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="57"/>
|
|
||||||
<source>浏览……</source>
|
|
||||||
<translation>browser...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="68"/>
|
|
||||||
<source>系统版本:</source>
|
|
||||||
<translation>System Version:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="75"/>
|
|
||||||
<location filename="mainwindow.ui" line="79"/>
|
|
||||||
<source>Windows 7 32 位(支持自动安装)</source>
|
|
||||||
<translation>Windows 7 32bit (support auto installing)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="84"/>
|
|
||||||
<source>Windows 7 64 位(支持自动安装)</source>
|
|
||||||
<translation>Windows 7 64bit (support auto installing)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="89"/>
|
|
||||||
<source>其它 Windows 系统(不支持自动安装,传统启动,推荐 Windows 7 及以下)</source>
|
|
||||||
<translation>Other system (unsupport auto installing and using legacy boot)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="94"/>
|
|
||||||
<source>其他 Windows 系统(不支持自动安装,UEFI 启动,推荐 Windows 8 及以上)</source>
|
|
||||||
<translation>Other system (unsupport auto installing and using UEFI boot)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="99"/>
|
|
||||||
<source>安装 WIndows 11(不支持自动安装)</source>
|
|
||||||
<translation>Install windows (unsupport auto installing)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="104"/>
|
|
||||||
<source>安装其他 Windows XP(支持自动安装,只支持 VirtualBox)</source>
|
|
||||||
<translation>Install other Windows XP (support auto installing but only support VirtualBox)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="109"/>
|
|
||||||
<source>安装其他 Windows (支持自动安装,传统启动,只支持 VirtualBox)</source>
|
|
||||||
<translation>Install Other Windows (support auto installing and using legacy boot but only support VirtualBox)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="114"/>
|
|
||||||
<source>安装其他 Windows(支持自动安装,UEFI 启动,只支持 VirtualBox)</source>
|
|
||||||
<translation>Install Other Windows (support auto installing and using UEFI boot but only support VirtualBox)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="119"/>
|
|
||||||
<source>安装 arm32 系统(只支持 Qemu)</source>
|
|
||||||
<translation>Install arm32 system (only support Qemu/KVM)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="124"/>
|
|
||||||
<source>安装 arm64 系统(只支持 Qemu)</source>
|
|
||||||
<translation>Install arm64 system (only support Qemu/KVM)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="136"/>
|
|
||||||
<source>虚拟机(建议默认):</source>
|
|
||||||
<translation>Virtual Machine:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="143"/>
|
|
||||||
<location filename="mainwindow.ui" line="153"/>
|
|
||||||
<source>qemu/kvm</source>
|
|
||||||
<translation></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="158"/>
|
|
||||||
<source>VirtualBox</source>
|
|
||||||
<translation></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="183"/>
|
|
||||||
<source>安装 Qemu</source>
|
|
||||||
<translation>Install Qemu</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="190"/>
|
|
||||||
<source>kvm 测试</source>
|
|
||||||
<translation>kvm test</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="197"/>
|
|
||||||
<source>Qemu虚拟机设置</source>
|
|
||||||
<translation>Qemu Setting</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="204"/>
|
|
||||||
<source>添加/覆盖Qemu磁盘</source>
|
|
||||||
<translation>Add/Replace Qemu Disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="211"/>
|
|
||||||
<source>导出Qemu磁盘</source>
|
|
||||||
<translation>Export Qemu Disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="218"/>
|
|
||||||
<source>移除Qemu磁盘</source>
|
|
||||||
<translation>Delete Qemu Disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="225"/>
|
|
||||||
<source>获取VirtualBox</source>
|
|
||||||
<translation>Get VirtualBox</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="232"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation>Install</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="241"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">UOS 3a4000 用户在使用 Qemu 时可能会出现虚拟机无法正常开机的问题,需要安装/降级到以下链接的版本:</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">蓝奏云:</span><a href="https://gfdgdxi.lanzoue.com/b01rk9wza"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://gfdgdxi.lanzoue.com/b01rk9wza</span></a><span style=" font-size:11pt;"> 密码:6wvf</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58662214-c46520?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58662214-c46520?p=2061</span></a><span style=" font-size:11pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">注:Qemu 跨架构效率较低,如无特殊情况不建议跨架构/不开硬件加速(如 kvm)运行 Qemu</span></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">如何安装系统?使用迅雷或者网盘下载以下任意一个链接的 ISO 镜像然后在上面选择即可:</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">123 网盘链接:</span><a href="https://www.123pan.com/s/pDSKVv-oypWv"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://www.123pan.com/s/pDSKVv-oypWv</span></a></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">迅雷网盘:</span><a href="https://pan.xunlei.com/s/VNKMz3wgbYHg6JIh50ZKIc7pA1?pwd=35e5"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.xunlei.com/s/VNKMz3wgbYHg6JIh50ZKIc7pA1?pwd=35e5</span></a><span style=" font-size:10pt;"> 提取码:35e5</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">百度网盘:</span><a href="https://pan.baidu.com/s/19WbvinITCQJFZpAdZutrjg?pwd=me4y"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.baidu.com/s/19WbvinITCQJFZpAdZutrjg?pwd=me4y</span></a><span style=" font-size:10pt;"> 提取码: me4y</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58662220-3590cf?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58662220-3590cf?p=2061</span></a><span style=" font-size:10pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">(如果下载这个,系统版本选第一项,一般推荐这个)</span><a href="ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/</span></a></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">(如果下载这个,系统版本选第二项)</span><a href="ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/</span></a></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt; font-weight:600;">常用 Windows 软件:</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">百度网盘:链接: </span><a href="https://pan.baidu.com/s/1D1NSy7k7XBnOZL_tNTnG6g?pwd=7s2p"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.baidu.com/s/1D1NSy7k7XBnOZL_tNTnG6g?pwd=7s2p</span></a><span style=" font-size:11pt;"> 提取码: 7s2p </span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58659214-0732a8?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58659214-0732a8?p=2061</span></a><span style=" font-size:11pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">123网盘:</span><a href="https://www.123pan.com/s/pDSKVv-uCBWv.html"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://www.123pan.com/s/pDSKVv-uCBWv.html</span></a></p>
|
|
||||||
<hr /></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="274"/>
|
|
||||||
<source>安装/使用帮助</source>
|
|
||||||
<translation>Document</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="283"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">给小白的一段话</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">其实本质上跑完安装程序就没有然后了,顶多如果想要运行舒服一点点,可以安装加强功能,直接拉到最底下看就可以了,<span style=" font-weight:600; font-style:italic; text-decoration: underline;">只限使用 VirtualBox</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic; text-decoration: underline;">如果你是用非 X86 PC,那暂时只能使用 qemu(没 kvm),且跨架构的性能损失很大,推荐使用 Windows XP 而非 Windows 7</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果爱折腾的话,下面的都看看也无所谓的,想看往下翻就可以了</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">(这里的帮助更新可能不会那么及时,更详细/新的帮助可以看:https://gitee.com/gfdgd-xi/deep-wine-runner/wikis 或 https://gitee.com/gfdgd-xi/wine-runner-wiki)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(如果鼠标被锁定到里面了按下键盘右边的“Ctrl”键就可以了,<span style=" font-weight:600; font-style:italic; text-decoration: underline;">qemu则是 Ctrl+Alt+G</span> )</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">VirtualBox 可以安装增强功能以优化体验,安装方法往下翻即可查询</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qemu 可以安装 Virtio 以优化体验,下载链接:<a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/</span></a></p>
|
|
||||||
<hr />
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">安装是否需要人工进行操作?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果您下载的镜像本程序支持,则大部分不用,已经尽量省去了让新手头疼的虚拟机程序安装,创建、设置虚拟机,虚拟磁盘分区,寻找原版镜像文件等内容</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712191756.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">但有些设置依旧需要人工自行设置,例如安装界面密钥的输入、系统的激活(涉及版权问题,不会考虑省略)、增强功能的安装、需要使用的软件等等</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712192850.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712193527.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">什么样的镜像本程序(可能)不支持自动安装?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">非 Windows 7 镜像可能不支持自动安装(纯的 Windows 7 企业版镜像可能不支持自动安装),不保证系统能自动安装成功,例如 Windows XP、Windows 10、Deepin、Ubuntu 等等</p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">默认的虚拟机设置不习惯怎么改?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">1、打开启动器,打开 Oracle VM VirtualBox 程序</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">2、选择名字为“Windows”的虚拟机,然后在右边点击设置</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Manager_20220712223602.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">3、在这里修改即可</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox_20220712223705.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">安装加强功能有什么好处?(只限使用 VirtualBox)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1、支持鼠标自由从虚拟机和实体机切换</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2、支持虚拟机根据窗口大小自动设置分辨率</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3、支持文件共享、剪切板共享、文件拖放</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4、支持无缝模式</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_选择区域_20220712224639.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">如何安装加强功能?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1、点击“设备”=》“加强功能”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图_VirtualBox Machine_20220712142929.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2、打开“计算机”,找到名为“VirtualBox Guest Additions”的光盘,双击进入,然后双击打开名为“VBoxWindowsAdditions”的程序</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143006.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3、在弹出的界面点击“是”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143018.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4、一直点“Next”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143029.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143037.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">5、全部选择,然后点击“Install”进行安装</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143044.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">6、等待安装完毕后,选择“Reboot now”然后点击“Finish”重启此虚拟机即可安装成功(选择“Reboot now”并点“Finish”会自动重新启动)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143103.png" /></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="364"/>
|
|
||||||
<location filename="mainwindow.ui" line="482"/>
|
|
||||||
<source>关于</source>
|
|
||||||
<translation>About</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="421"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">此为 wine 运行器附属组件(虽然违背了“Wine Is Not An Emulator”&lt;Wine 不是一个模拟器&gt;的原意),旨在能更加完美、简单的运行 Windows 应用</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本程序基于 C++ Qt、Python 和 Virtualbox 制作,通过运行安装 Windows 操作系统的虚拟机实现在 Linux 运行 Windows exe 程序的功能。</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">基于 GPL V3 协议开源</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">项目地址:</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Gitee:<a href="https://gitee.com/gfdgd-xi/deep-wine-runner"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://gitee.com/gfdgd-xi/deep-wine-runner</span></a></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Github:<a href="https://github.com/gfdgd-xi/deep-wine-runner"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://github.com/gfdgd-xi/deep-wine-runner</span></a></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">此组件也有非常大的缺点,就是相比于 Wine,会需要占用大量的空间、安装需要大量的时间、某些情况下需要相比于 Wine 需要消耗更多的系统资源,但可以更加完美、流畅的运行 Windows 应用,会尽量减少因为缺少或未实现导致的 Windows exe 程序运行异常</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">该组件制作者:gfdgd xi</p>
|
|
||||||
<hr />
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="463"/>
|
|
||||||
<source>虚拟机</source>
|
|
||||||
<translation>Virtual Machine</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="477"/>
|
|
||||||
<source>退出</source>
|
|
||||||
<translation>Exit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="487"/>
|
|
||||||
<source>导入/覆盖</source>
|
|
||||||
<translation>Add/Replace</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="492"/>
|
|
||||||
<source>导出</source>
|
|
||||||
<translation>Export</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="497"/>
|
|
||||||
<location filename="mainwindow.cpp" line="442"/>
|
|
||||||
<source>虚拟机安装日志</source>
|
|
||||||
<translation>Virtual Machine log (Installing)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="502"/>
|
|
||||||
<location filename="mainwindow.cpp" line="408"/>
|
|
||||||
<source>虚拟机运行日志</source>
|
|
||||||
<translation>Virtual Machine log (Running)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="507"/>
|
|
||||||
<source>虚拟机测试(X86、Qemu)</source>
|
|
||||||
<translation>Qemu Test (x86, qemu)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="512"/>
|
|
||||||
<source>强制停止 VirtualBox</source>
|
|
||||||
<translation>Stop VirtualBox with forced</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="517"/>
|
|
||||||
<source>强制停止 Qemu</source>
|
|
||||||
<translation>Stop Qemu with forced</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="88"/>
|
|
||||||
<source>Wine 运行器虚拟机安装工具 </source>
|
|
||||||
<translation>Wine Runner Virtual Machine Install Tools </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source><p>程序版本号:</source>
|
|
||||||
<translation><p>Program Version:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source></p><p>安装包构建时间:</source>
|
|
||||||
<translation></p><p>Package build time:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source></p><p>该组件构建时间:</source>
|
|
||||||
<translation></p><p>Tools builded time:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="92"/>
|
|
||||||
<source><hr/><h1>谢明列表</h1></source>
|
|
||||||
<translation><hr/><h1>Thank</h1></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="179"/>
|
|
||||||
<location filename="mainwindow.cpp" line="186"/>
|
|
||||||
<location filename="mainwindow.cpp" line="193"/>
|
|
||||||
<location filename="mainwindow.cpp" line="200"/>
|
|
||||||
<location filename="mainwindow.cpp" line="215"/>
|
|
||||||
<location filename="mainwindow.cpp" line="222"/>
|
|
||||||
<location filename="mainwindow.cpp" line="229"/>
|
|
||||||
<location filename="mainwindow.cpp" line="248"/>
|
|
||||||
<location filename="mainwindow.cpp" line="254"/>
|
|
||||||
<location filename="mainwindow.cpp" line="263"/>
|
|
||||||
<location filename="mainwindow.cpp" line="307"/>
|
|
||||||
<location filename="mainwindow.cpp" line="322"/>
|
|
||||||
<location filename="mainwindow.cpp" line="328"/>
|
|
||||||
<location filename="mainwindow.cpp" line="332"/>
|
|
||||||
<location filename="mainwindow.cpp" line="338"/>
|
|
||||||
<location filename="mainwindow.cpp" line="357"/>
|
|
||||||
<location filename="mainwindow.cpp" line="360"/>
|
|
||||||
<location filename="mainwindow.cpp" line="364"/>
|
|
||||||
<location filename="mainwindow.cpp" line="367"/>
|
|
||||||
<location filename="mainwindow.cpp" line="392"/>
|
|
||||||
<location filename="mainwindow.cpp" line="404"/>
|
|
||||||
<location filename="mainwindow.cpp" line="438"/>
|
|
||||||
<source>提示</source>
|
|
||||||
<translation>Tips</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="179"/>
|
|
||||||
<source>您似乎没有安装 Qemu,是否继续创建虚拟机?</source>
|
|
||||||
<translation>Can't find qemu, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="186"/>
|
|
||||||
<source>您似乎没有安装 VBox,是否继续创建虚拟机?</source>
|
|
||||||
<translation>Can't find VirtualBox, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="193"/>
|
|
||||||
<source>无法检测到 qemu-system-arm,是否继续创建虚拟机?</source>
|
|
||||||
<translation>Can't find the qemu-system-arm, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="200"/>
|
|
||||||
<source>无法检测到 qemu-system-aarch64,是否继续创建虚拟机?</source>
|
|
||||||
<translation>Can't find the qemu-system-aarch64, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="215"/>
|
|
||||||
<source>似乎无法找到 Windows7X86Auto.iso,是否继续创建虚拟机?
|
|
||||||
缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?</source>
|
|
||||||
<translation>Can't find the Windows7X86Auto.iso, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="222"/>
|
|
||||||
<source>似乎无法找到 Windows7X64Auto.iso,是否继续创建虚拟机?
|
|
||||||
缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?</source>
|
|
||||||
<translation>Can't find the Windows7X64Auto.iso, do you want to countinue to create the virtual machine?</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="229"/>
|
|
||||||
<source>似乎无法找到 UEFI 固件,是否继续创建虚拟机?
|
|
||||||
Qemu 固件可以在“安装 Qemu”处安装</source>
|
|
||||||
<translation>Can't find the UEFI boot, do you want to countinue to create the virtual machine?
|
|
||||||
You can get qemu efi from "Install Qemu" button</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="248"/>
|
|
||||||
<source>Qemu 不支持该选项!</source>
|
|
||||||
<translation>Qemu unsupport it</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="254"/>
|
|
||||||
<location filename="mainwindow.cpp" line="263"/>
|
|
||||||
<source>VirtualBox 不支持该选项!</source>
|
|
||||||
<translation>VirtualBox unsupport it</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="278"/>
|
|
||||||
<source>提示:目前已经尝试开启虚拟机,如果在一段时间后依旧还没看到虚拟机窗口开启,请在菜单栏查看虚拟机日志</source>
|
|
||||||
<translation>Tips: It trying to start virtualbox now, you should view the log in the tools menu if you can't see the virtual machine window a few time late</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="307"/>
|
|
||||||
<source>磁盘文件已存在,是否覆盖?
|
|
||||||
覆盖后将无法恢复!</source>
|
|
||||||
<translation>Qemu Disk is exist. Do you want to replace?
|
|
||||||
You will not recovery after you replacing!</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="311"/>
|
|
||||||
<source>选择 Qemu 镜像</source>
|
|
||||||
<translation>Choose Qemu Disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="311"/>
|
|
||||||
<source>Qemu镜像(*.qcow2 *.img *.raw *.qcow *.qed *.vdi *.vhdx *.vmdk);;所有文件(*.*)</source>
|
|
||||||
<translation>Qemu Disk(*.qcow2 *.img *.raw *.qcow *.qed *.vdi *.vhdx *.vmdk);;All files(*.*)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="322"/>
|
|
||||||
<location filename="mainwindow.cpp" line="328"/>
|
|
||||||
<source>添加错误!</source>
|
|
||||||
<translation>Add error!</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="332"/>
|
|
||||||
<source>添加完成!</source>
|
|
||||||
<translation>Add finishing!</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="338"/>
|
|
||||||
<source>不存在磁盘文件,无法导出</source>
|
|
||||||
<translation>Can't export because can't find the qemu disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="357"/>
|
|
||||||
<source>不存在磁盘文件,无法移除</source>
|
|
||||||
<translation>Can't delete because can't find the qemu disk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="360"/>
|
|
||||||
<source>是否删除?
|
|
||||||
删除后将无法恢复!</source>
|
|
||||||
<translation>Do you want to delete?
|
|
||||||
It can't recovery after you deleting!</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="364"/>
|
|
||||||
<source>移除失败</source>
|
|
||||||
<translation>Delete error</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="367"/>
|
|
||||||
<source>移除成功</source>
|
|
||||||
<translation>Delete successfully</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="373"/>
|
|
||||||
<location filename="mainwindow.cpp" line="389"/>
|
|
||||||
<source>错误</source>
|
|
||||||
<translation>Error</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="373"/>
|
|
||||||
<source>未识别到命令 kvm-ok
|
|
||||||
可以使用命令 sudo apt install cpu-checker 安装</source>
|
|
||||||
<translation>Can't find the command "kvm-ok" and you can use command "sudo apt install cpu-checker" to install</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="383"/>
|
|
||||||
<source>使用</source>
|
|
||||||
<translation>Use</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="389"/>
|
|
||||||
<source>您的系统不支持使用 kvm:
|
|
||||||
</source>
|
|
||||||
<translation>Your system can't use kvm:
|
|
||||||
</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="392"/>
|
|
||||||
<source>您的系统支持使用 kvm:
|
|
||||||
</source>
|
|
||||||
<translation>Your system can use kvm:
|
|
||||||
</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="404"/>
|
|
||||||
<location filename="mainwindow.cpp" line="438"/>
|
|
||||||
<source>没有日志文件</source>
|
|
||||||
<translation>Can't find the log file</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="408"/>
|
|
||||||
<source>运行日志</source>
|
|
||||||
<translation>Running file</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="442"/>
|
|
||||||
<source>安装日志</source>
|
|
||||||
<translation>Installed log</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>QemuSetting</name>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="14"/>
|
|
||||||
<source>设置</source>
|
|
||||||
<translation>Setting</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="35"/>
|
|
||||||
<source><h3>远程服务</h3></source>
|
|
||||||
<translation><h3>Remote Service</h3></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="42"/>
|
|
||||||
<source>VNC服务端口:</source>
|
|
||||||
<translation>VNC service port:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="49"/>
|
|
||||||
<source>开启 rdp 服务映射</source>
|
|
||||||
<translation>Enable rdp port</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="56"/>
|
|
||||||
<source>内存大小(MB):</source>
|
|
||||||
<translation>Memory size (MB):</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="90"/>
|
|
||||||
<source><h3>基础设置</h3></source>
|
|
||||||
<translation><h3>Base setting</h3></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="97"/>
|
|
||||||
<source>开启VNC服务</source>
|
|
||||||
<translation>Enable VNC service</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="104"/>
|
|
||||||
<source>开启 kvm 加速</source>
|
|
||||||
<translation>Enable kvm</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="111"/>
|
|
||||||
<source>CPU核心数:</source>
|
|
||||||
<translation>CPU cores:</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="125"/>
|
|
||||||
<source>开启声音</source>
|
|
||||||
<translation>Enable sound</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="145"/>
|
|
||||||
<source>保存</source>
|
|
||||||
<translation>Save</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="158"/>
|
|
||||||
<source>取消</source>
|
|
||||||
<translation>Cancel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="171"/>
|
|
||||||
<source>重置
|
|
||||||
默认</source>
|
|
||||||
<translation>Resetting</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="185"/>
|
|
||||||
<source>获取
|
|
||||||
Wine
|
|
||||||
运行器</source>
|
|
||||||
<translation>Get Wine
|
|
||||||
Runner</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
|
||||||
@@ -1,218 +0,0 @@
|
|||||||
/*
|
|
||||||
来自:https://gitee.com/zinface/z-tools/tree/speedwidget-dev/src/SpeedWidget/infoUtils
|
|
||||||
依据 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#include "infoutils.h"
|
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QTextStream>
|
|
||||||
#include <QtMath>
|
|
||||||
|
|
||||||
infoUtils::infoUtils(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QString infoUtils::setRateUnitSensitive(infoUtils::RateUnit unit, infoUtils::Sensitive sensitive)
|
|
||||||
{
|
|
||||||
switch (sensitive) {
|
|
||||||
case Sensitive::Default: {
|
|
||||||
switch (unit) {
|
|
||||||
case RateUnit::RateBit:
|
|
||||||
return QString("b/s");
|
|
||||||
case RateUnit::RateByte:
|
|
||||||
return QString("B/s");
|
|
||||||
case RateUnit::RateKb:
|
|
||||||
return QString("Kb/s");
|
|
||||||
case RateUnit::RateMb:
|
|
||||||
return QString("Mb/s");
|
|
||||||
case RateUnit::RateGb:
|
|
||||||
return QString("Gb/s");
|
|
||||||
case RateUnit::RateTb:
|
|
||||||
return QString("Tb/s");
|
|
||||||
default:
|
|
||||||
// qDebug()<<QString("Sensitive::Default, RateUnit is RateUnknow.");
|
|
||||||
return QString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case Sensitive::Upper: {
|
|
||||||
switch (unit) {
|
|
||||||
case RateUnit::RateBit:
|
|
||||||
return QString("BIT/S");
|
|
||||||
case RateUnit::RateByte:
|
|
||||||
return QString("B/S");
|
|
||||||
case RateUnit::RateKb:
|
|
||||||
return QString("KB/S");
|
|
||||||
case RateUnit::RateMb:
|
|
||||||
return QString("MB/S");
|
|
||||||
case RateUnit::RateGb:
|
|
||||||
return QString("GB/S");
|
|
||||||
case RateUnit::RateTb:
|
|
||||||
return QString("TB/S");
|
|
||||||
default:
|
|
||||||
// qDebug()<<QString("Sensitive::Upper, RateUnit is RateUnknow.");
|
|
||||||
return QString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case Sensitive::Lower: {
|
|
||||||
switch (unit) {
|
|
||||||
case RateUnit::RateBit:
|
|
||||||
return QString("bit/s");
|
|
||||||
case RateUnit::RateByte:
|
|
||||||
return QString("b/s");
|
|
||||||
case RateUnit::RateKb:
|
|
||||||
return QString("kb/s");
|
|
||||||
case RateUnit::RateMb:
|
|
||||||
return QString("mb/s");
|
|
||||||
case RateUnit::RateGb:
|
|
||||||
return QString("gb/s");
|
|
||||||
case RateUnit::RateTb:
|
|
||||||
return QString("tb/s");
|
|
||||||
default:
|
|
||||||
// qDebug()<<QString("Sensitive::Lower, RateUnit is RateUnknow.");
|
|
||||||
return QString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
// qDebug()<<QString("Sensitive is RateUnknow.");
|
|
||||||
return QString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double infoUtils::autoRateUnits(long speed, infoUtils::RateUnit &unit)
|
|
||||||
{
|
|
||||||
/* 自动判断合适的速率单位,默认传进来的是 Byte
|
|
||||||
* bit 0 ~ 7 位 (不到 1 字节)
|
|
||||||
* Byte 1 ~ 2^10 Byte
|
|
||||||
* KB 2^10 ~ 2^20 Byte
|
|
||||||
* MB 2^20 ~ 2^30 Byte
|
|
||||||
* GB 2^30 ~ 2^40 Byte
|
|
||||||
* TB 2^40 ~ 2^50 Byte
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (unit != infoUtils::RateByte) {
|
|
||||||
// qDebug()<<"请先将单位转为字节(byte)后再传参";
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
double sp = 0;
|
|
||||||
if (0 <= speed && speed < qPow(2, 10)) {
|
|
||||||
unit = infoUtils::RateByte;
|
|
||||||
sp = speed;
|
|
||||||
} else if (qPow(2, 10) <= speed && speed < qPow(2, 20)) {
|
|
||||||
unit = infoUtils::RateKb;
|
|
||||||
sp = static_cast<double>(speed / qPow(2, 10) * 1.0);
|
|
||||||
} else if (qPow(2, 20) <= speed && speed < qPow(2, 30)) {
|
|
||||||
unit = infoUtils::RateMb;
|
|
||||||
sp = static_cast<double>(speed / qPow(2, 20) * 1.0);
|
|
||||||
} else if (qPow(2, 30) <= speed && speed < qPow(2, 40)) {
|
|
||||||
unit = infoUtils::RateGb;
|
|
||||||
sp = static_cast<double>(speed / qPow(2, 30) * 1.0);
|
|
||||||
} else if (qPow(2, 40) <= speed && speed < qPow(2, 50)) {
|
|
||||||
unit = infoUtils::RateTb;
|
|
||||||
sp = static_cast<double>(speed / qPow(2, 40) * 1.0);
|
|
||||||
} else {
|
|
||||||
unit = infoUtils::RateUnknow;
|
|
||||||
// qDebug()<<"本设备网络速率单位传输超过 TB, 或者低于 0 Byte.";
|
|
||||||
sp = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void infoUtils::uptime(double &run, double &idle)
|
|
||||||
{
|
|
||||||
QFile file(PROC_UPTIME); // /proc/uptime
|
|
||||||
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream stream(&file);
|
|
||||||
QString line = stream.readLine();
|
|
||||||
QStringList list = line.split(QRegExp("\\s{1,}"));
|
|
||||||
if(!list.isEmpty()) {
|
|
||||||
run = list.at(0).toDouble();
|
|
||||||
idle = list.at(1).toDouble();
|
|
||||||
}
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void infoUtils::netRate(long &netDown, long &netUpload)
|
|
||||||
{
|
|
||||||
QFile file(PROC_NET); // /proc/net/dev
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { // 在读取时,把行尾结束符修改为 '\n'; 在写入时,把行尾结束符修改为本地系统换行风格,比如Windows文本换行是 "\r\n"
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
long down = 0;
|
|
||||||
long upload = 0;
|
|
||||||
QTextStream stream(&file);
|
|
||||||
QString line = stream.readLine();
|
|
||||||
line = stream.readLine();
|
|
||||||
line = stream.readLine();
|
|
||||||
while (!line.isNull()) {
|
|
||||||
line = line.trimmed();
|
|
||||||
QStringList list = line.split(QRegExp("\\s{1,}")); // 匹配任意 大于等于1个的 空白字符
|
|
||||||
|
|
||||||
if (!list.isEmpty()) {
|
|
||||||
down = list.at(1).toLong();
|
|
||||||
upload = list.at(9).toLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
netDown += down;
|
|
||||||
netUpload += upload;
|
|
||||||
line = stream.readLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void infoUtils::cpuRate(long &cpuAll, long &cpuFree)
|
|
||||||
{
|
|
||||||
cpuAll = cpuFree = 0;
|
|
||||||
bool ok = false;
|
|
||||||
|
|
||||||
QFile file(PROC_CPU); // /proc/stat
|
|
||||||
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream stream(&file);
|
|
||||||
QString line = stream.readLine();
|
|
||||||
if (!line.isNull()) {
|
|
||||||
QStringList list = line.split(QRegExp("\\s{1,}"));
|
|
||||||
for (auto v = list.begin() + 1; v != list.end(); ++v)
|
|
||||||
cpuAll += (*v).toLong(&ok);
|
|
||||||
|
|
||||||
cpuFree = list.at(4).toLong(&ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void infoUtils::memoryRate(long &memory, long &memoryAll, long &swap, long &swapAll)
|
|
||||||
{
|
|
||||||
memory = memoryAll = 0;
|
|
||||||
swap = swapAll = 0;
|
|
||||||
bool ok = false;
|
|
||||||
|
|
||||||
QFile file(PROC_MEM); // /proc/meminfo
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
||||||
return;
|
|
||||||
|
|
||||||
QTextStream stream(&file);
|
|
||||||
long buff[16] = {0};
|
|
||||||
for (int i = 0; i <= 15; ++i) {
|
|
||||||
QString line = stream.readLine();
|
|
||||||
QStringList list = line.split(QRegExp("\\s{1,}"));
|
|
||||||
buff[i] = list.at(1).toLong(&ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
memoryAll = buff[0];
|
|
||||||
memory = buff[0] - buff[2];
|
|
||||||
swapAll = buff[14];
|
|
||||||
swap = buff[14] - buff[15];
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#ifndef INFOUTILS_H
|
|
||||||
#define INFOUTILS_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#define PROC_UPTIME "/proc/uptime"
|
|
||||||
#define PROC_CPU "/proc/stat"
|
|
||||||
#define PROC_MEM "/proc/meminfo"
|
|
||||||
#define PROC_NET "/proc/net/dev"
|
|
||||||
|
|
||||||
class infoUtils : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum RateUnit {
|
|
||||||
RateBit,
|
|
||||||
RateByte,
|
|
||||||
RateKb,
|
|
||||||
RateMb,
|
|
||||||
RateGb,
|
|
||||||
RateTb,
|
|
||||||
RateUnknow
|
|
||||||
};
|
|
||||||
Q_ENUM(RateUnit)
|
|
||||||
|
|
||||||
enum Sensitive {
|
|
||||||
Default, // 大小写混合
|
|
||||||
Upper, // 全部大写
|
|
||||||
Lower // 全部小写
|
|
||||||
};
|
|
||||||
public:
|
|
||||||
explicit infoUtils(QObject *parent = nullptr);
|
|
||||||
|
|
||||||
static QString setRateUnitSensitive(RateUnit unit, Sensitive sensitive);
|
|
||||||
static double autoRateUnits(long speed, RateUnit &unit);
|
|
||||||
|
|
||||||
static void uptime(double &run, double &idle);
|
|
||||||
static void netRate(long &netDown, long &netUpload);
|
|
||||||
static void cpuRate(long &cpuAll, long &cpuFree);
|
|
||||||
static void memoryRate(long &memory, long &memoryAll, long &swap, long &swapAll);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // INFOUTILS_H
|
|
||||||
132
VM-source/kvm-ok
@@ -1,132 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# kvm-ok - check whether the CPU we're running on supports KVM acceleration
|
|
||||||
# Copyright (C) 2008-2010 Canonical Ltd.
|
|
||||||
#
|
|
||||||
# Authors:
|
|
||||||
# Dustin Kirkland <kirkland@canonical.com>
|
|
||||||
# Kees Cook <kees.cook@canonical.com>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License version 3,
|
|
||||||
# as published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
set -e
|
|
||||||
|
|
||||||
assert_root() {
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
|
||||||
echo "INFO: For more detailed results, you should run this as root"
|
|
||||||
echo "HINT: sudo $0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
verdict() {
|
|
||||||
# Print verdict
|
|
||||||
if [ "$1" = "0" ]; then
|
|
||||||
echo "KVM acceleration can be used"
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "KVM acceleration can NOT be used"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
ARM_CPU_PART_CORTEX_A15="0xc0f" # <asm/cputype.h>
|
|
||||||
|
|
||||||
# check cpu flags for capability
|
|
||||||
case "$(uname -m)" in
|
|
||||||
armv7l)
|
|
||||||
if egrep -m1 -w '^CPU part[[:blank:]]*:' /proc/cpuinfo | \
|
|
||||||
egrep -wq "$ARM_CPU_PART_CORTEX_A15"; then
|
|
||||||
virt="ARM"
|
|
||||||
kvm_mod="kvm"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
aarch64)
|
|
||||||
virt="ARM"
|
|
||||||
kvm_mod="kvm"
|
|
||||||
;;
|
|
||||||
ppc64le|ppc64|s390x)
|
|
||||||
# FIXME: Assume that all POWER and z/Systems are KVM capable
|
|
||||||
virt="generic"
|
|
||||||
kvm_mod="kvm"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
virt=$(egrep -m1 -w '^flags[[:blank:]]*:' /proc/cpuinfo | egrep -wo '(vmx|svm)') || true
|
|
||||||
[ "$virt" = "vmx" ] && kvm_mod="kvm_intel"
|
|
||||||
[ "$virt" = "svm" ] && kvm_mod="kvm_amd"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -z "$virt" ]; then
|
|
||||||
echo "INFO: Your CPU does not support KVM extensions"
|
|
||||||
assert_root
|
|
||||||
verdict 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Now, check that the device exists
|
|
||||||
if [ -e /dev/kvm ]; then
|
|
||||||
echo "INFO: /dev/kvm exists"
|
|
||||||
verdict 0
|
|
||||||
else
|
|
||||||
echo "INFO: /dev/kvm does not exist"
|
|
||||||
echo "HINT: sudo modprobe $kvm_mod"
|
|
||||||
fi
|
|
||||||
|
|
||||||
assert_root
|
|
||||||
|
|
||||||
# Prepare MSR access
|
|
||||||
msr="/dev/cpu/0/msr"
|
|
||||||
if [ ! -r "$msr" ]; then
|
|
||||||
modprobe msr
|
|
||||||
fi
|
|
||||||
if [ -e "$msr" -a ! -r "$msr" ]; then
|
|
||||||
echo "You must be root to run this check." >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "INFO: Your CPU supports KVM extensions"
|
|
||||||
|
|
||||||
disabled=0
|
|
||||||
# check brand-specific registers
|
|
||||||
if [ "$virt" = "vmx" ]; then
|
|
||||||
BIT=$(rdmsr --bitfield 0:0 0x3a 2>/dev/null || true)
|
|
||||||
if [ "$BIT" = "1" ]; then
|
|
||||||
# and FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX clear (no tboot)
|
|
||||||
BIT=$(rdmsr --bitfield 2:2 0x3a 2>/dev/null || true)
|
|
||||||
if [ "$BIT" = "0" ]; then
|
|
||||||
disabled=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
elif [ "$virt" = "svm" ]; then
|
|
||||||
BIT=$(rdmsr --bitfield 4:4 0xc0010114 2>/dev/null || true)
|
|
||||||
if [ "$BIT" = "1" ]; then
|
|
||||||
disabled=1
|
|
||||||
fi
|
|
||||||
elif [ "$virt" = "ARM" ]; then
|
|
||||||
# Should also test that we booted in HYP mode, if detectable
|
|
||||||
:
|
|
||||||
elif [ "$virt" = "generic" ]; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "FAIL: Unknown virtualization extension: $virt"
|
|
||||||
verdict 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$disabled" -eq 1 ]; then
|
|
||||||
echo "INFO: KVM ($virt) is disabled by your BIOS"
|
|
||||||
echo "HINT: Enter your BIOS setup and enable Virtualization Technology (VT),"
|
|
||||||
echo " and then hard poweroff/poweron your system"
|
|
||||||
verdict 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
verdict 0
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#include "mainwindow.h"
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
QString GetRunCommand(QString command){
|
|
||||||
QProcess process;
|
|
||||||
process.start(command);
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
QString re = process.readAllStandardOutput();
|
|
||||||
process.close();
|
|
||||||
return re;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
QApplication a(argc, argv);
|
|
||||||
// 语言
|
|
||||||
QTranslator *trans = new QTranslator(&a);
|
|
||||||
if(!QProcessEnvironment::systemEnvironment().value("LANG").contains("zh_CN")){
|
|
||||||
trans->load(":/en_US.qm");
|
|
||||||
}
|
|
||||||
|
|
||||||
a.installTranslator(trans);
|
|
||||||
|
|
||||||
|
|
||||||
// 判断是否为 !amd64(无需判断了)
|
|
||||||
/*if(GetRunCommand("arch").replace(" ", "").replace("\n", "") != QString("x86_64")){
|
|
||||||
QMessageBox::critical(NULL, "错误", "此程序不支持非 X86 架构,立即退出");
|
|
||||||
return 0;
|
|
||||||
}*/
|
|
||||||
MainWindow w;
|
|
||||||
|
|
||||||
w.show();
|
|
||||||
|
|
||||||
return a.exec();
|
|
||||||
}
|
|
||||||
@@ -1,484 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#include "mainwindow.h"
|
|
||||||
#include "ui_mainwindow.h"
|
|
||||||
#include "buildvbox.h"
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QNetworkInterface>
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QLoggingCategory>
|
|
||||||
#include <infoutils.h>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QJsonParseError>
|
|
||||||
#include <QJsonValue>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QtMath>
|
|
||||||
#include <QJsonArray>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <iostream>
|
|
||||||
#include <QIODevice>
|
|
||||||
#include <QInputDialog>
|
|
||||||
#include "qemusetting.h"
|
|
||||||
#include "vbox.h"
|
|
||||||
#include "qemu.h"
|
|
||||||
|
|
||||||
#include <QInputDialog>
|
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) :
|
|
||||||
QMainWindow(parent),
|
|
||||||
ui(new Ui::MainWindow)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
//QApplication a(argc, argv);
|
|
||||||
ui->tabWidget->setTabPosition(QTabWidget::West); // 标签靠左
|
|
||||||
// 选择最优虚拟机
|
|
||||||
if(!system("which qemu-system-x86_64")){
|
|
||||||
ui->vmChooser->setCurrentIndex(0);
|
|
||||||
}
|
|
||||||
if(!system("which vboxmanage")){
|
|
||||||
ui->vmChooser->setCurrentIndex(1);
|
|
||||||
}
|
|
||||||
if(!QFile::exists(QCoreApplication::applicationDirPath() + "/../RunCommandWithTerminal.py")){
|
|
||||||
ui->getQemu->setDisabled(true);
|
|
||||||
}
|
|
||||||
// 允许输出 qDebug 信息
|
|
||||||
QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
|
|
||||||
// 判断是否安装 vbox(无需判断)
|
|
||||||
/*if(system("which VBoxManage")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), "检测到您似乎没有安装 VirtualBox,立即安装?") == QMessageBox::Yes){
|
|
||||||
system("xdg-open https://www.virtualbox.org/wiki/Linux_Downloads");
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
// QTimer
|
|
||||||
QTimer *cpuGet = new QTimer(this);
|
|
||||||
connect(cpuGet, &QTimer::timeout, this, &MainWindow::ShowCPUMessage);
|
|
||||||
cpuGet->setInterval(1000);
|
|
||||||
cpuGet->start();
|
|
||||||
MainWindow::ShowCPUMessage();
|
|
||||||
// 读取程序版本号
|
|
||||||
// / 版本号文件是否存在
|
|
||||||
QFile fileinfo(QCoreApplication::applicationDirPath() + "/../information.json");
|
|
||||||
if(!fileinfo.exists()){
|
|
||||||
fileinfo.close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fileinfo.open(QIODevice::ReadOnly);
|
|
||||||
QJsonParseError error;
|
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(fileinfo.readAll(), &error);
|
|
||||||
if(error.error != QJsonParseError::NoError){
|
|
||||||
QMessageBox::critical(this, "错误", "无法读取版本号!");
|
|
||||||
qDebug() << error.errorString();
|
|
||||||
fileinfo.close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QJsonObject versionObject = doc.object();
|
|
||||||
QJsonValue buildTime = versionObject.value("Time");
|
|
||||||
QJsonValue versionValue = versionObject.value("Version");
|
|
||||||
QJsonArray thank = versionObject.value("Thank").toArray();
|
|
||||||
QString thankText = "";
|
|
||||||
for (int i = 0; thank.count() > i; i++) {
|
|
||||||
thankText += "<p>" + thank.at(i).toString() + "</p>\n";
|
|
||||||
qDebug() << thank.at(i).toString();
|
|
||||||
|
|
||||||
}
|
|
||||||
// 设置程序标题
|
|
||||||
this->setWindowTitle(tr("Wine 运行器虚拟机安装工具 ") + versionValue.toString());
|
|
||||||
// 读取谢明列表
|
|
||||||
ui->textBrowser_2->setHtml(tr("<p>程序版本号:") + versionValue.toString() + ", " + GetRunCommand("arch") + tr("</p><p>安装包构建时间:") + buildTime.toString() + tr("</p><p>该组件构建时间:")
|
|
||||||
+ __DATE__ + " " + __TIME__ + "</p>" + ui->textBrowser_2->toHtml() +
|
|
||||||
tr("<hr/><h1>谢明列表</h1>") + thankText);
|
|
||||||
connect(ui->textBrowser_2, &QTextBrowser::anchorClicked, this, [=](const QUrl &link){
|
|
||||||
QDesktopServices::openUrl(link);
|
|
||||||
});
|
|
||||||
connect(ui->textBrowser, &QTextBrowser::anchorClicked, this, [=](const QUrl &link){
|
|
||||||
QDesktopServices::openUrl(link);
|
|
||||||
});
|
|
||||||
connect(ui->textBrowser_3, &QTextBrowser::anchorClicked, this, [=](const QUrl &link){
|
|
||||||
QDesktopServices::openUrl(link);
|
|
||||||
});
|
|
||||||
// 设置标签栏图标
|
|
||||||
ui->tabWidget->setTabIcon(1, QIcon::fromTheme(":/application-vnd.oasis.opendocument.text.svg"));
|
|
||||||
// 设置窗口图标
|
|
||||||
this->setWindowIcon(QIcon(":/deepin-wine-runner.svg"));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::ShowCPUMessage(){
|
|
||||||
// 获取 CPU 占用率
|
|
||||||
long cpuAll = 0;
|
|
||||||
long cpuFree = 0;
|
|
||||||
infoUtils::cpuRate(cpuAll, cpuFree);
|
|
||||||
long cpu = ((cpuAll - m_cpuAll) - (cpuFree - m_cpuFree)) * 100 / (cpuAll - m_cpuAll);
|
|
||||||
if(cpu > 100){
|
|
||||||
// 处理异常值
|
|
||||||
cpu = 100;
|
|
||||||
}
|
|
||||||
// 获取内存占用率
|
|
||||||
long memory = 0;
|
|
||||||
long memoryAll = 0;
|
|
||||||
long swap = 0;
|
|
||||||
long swapAll = 0;
|
|
||||||
|
|
||||||
infoUtils::memoryRate(memory, memoryAll, swap, swapAll);
|
|
||||||
|
|
||||||
// 获取开机时间
|
|
||||||
double run,idle;
|
|
||||||
infoUtils::uptime(run,idle);
|
|
||||||
int time = qFloor(run);
|
|
||||||
int ss = time % 60;
|
|
||||||
int MM = (time % 3600) / 60;
|
|
||||||
int hh = (time % 86400) / 3600;
|
|
||||||
int dd = time / 86400;
|
|
||||||
|
|
||||||
|
|
||||||
QString info = "CPU: " + QString::number(cpu) + "% 内存: " +
|
|
||||||
QString::number(memory * 100 / memoryAll) + "% " + QString::number(memory / 1024) + "MB/" + QString::number(memoryAll / 1024) + "MB" +
|
|
||||||
" 开机时间: " + QString::number(dd) + "天 " + QString::number(hh) + ":" + QString::number(MM) + ":" + QString::number(ss);
|
|
||||||
//qDebug() << cpuAll << " " << cpuFree;
|
|
||||||
if(!stopShowTime){
|
|
||||||
ui->CPUValue->showMessage(info, 5000);
|
|
||||||
}
|
|
||||||
m_cpuAll = cpuAll;
|
|
||||||
m_cpuFree = cpuFree;
|
|
||||||
//ui->retranslateUi(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString MainWindow::GetRunCommand(QString command){
|
|
||||||
QProcess process;
|
|
||||||
process.start(command);
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
QString re = process.readAllStandardOutput();
|
|
||||||
process.close();
|
|
||||||
return re;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_browser_clicked()
|
|
||||||
{
|
|
||||||
// 浏览镜像文件
|
|
||||||
QString filePath = QFileDialog::getOpenFileName(this, "选择 ISO 文件", QDir::homePath(), "ISO 镜像文件(*.iso);;所有文件(*.*)");
|
|
||||||
if(filePath != ""){
|
|
||||||
ui->isoPath->setText(filePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_install_clicked()
|
|
||||||
{
|
|
||||||
switch (ui->vmChooser->currentIndex()) {
|
|
||||||
case 0:
|
|
||||||
if(system("which qemu-system-x86_64")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("您似乎没有安装 Qemu,是否继续创建虚拟机?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(system("which vboxmanage")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("您似乎没有安装 VBox,是否继续创建虚拟机?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
if(system("which qemu-system-arm")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("无法检测到 qemu-system-arm,是否继续创建虚拟机?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
if(system("which qemu-system-aarch64")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("无法检测到 qemu-system-aarch64,是否继续创建虚拟机?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
QFile file(QDir::homePath() + "/.config/deepin-wine-runner/QEMU-EFI");
|
|
||||||
QFile archFile(QDir::homePath() + "/.config/deepin-wine-runner/QEMU-ARCH");
|
|
||||||
QDir dir(QDir::homePath() + "/.config/deepin-wine-runner");
|
|
||||||
archFile.open(QIODevice::WriteOnly);
|
|
||||||
archFile.write("amd64");
|
|
||||||
archFile.close();
|
|
||||||
switch (ui->systemVersion->currentIndex()) {
|
|
||||||
case 0:
|
|
||||||
if(!QFile::exists(QCoreApplication::applicationDirPath() + "/Windows7X86Auto.iso")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("似乎无法找到 Windows7X86Auto.iso,是否继续创建虚拟机?\n缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(!QFile::exists(QCoreApplication::applicationDirPath() + "/Windows7X64Auto.iso")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("似乎无法找到 Windows7X64Auto.iso,是否继续创建虚拟机?\n缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if(!QFile::exists("/usr/share/qemu/OVMF.fd") && !QFile::exists(QCoreApplication::applicationDirPath() + "/OVMF.fd") && ui->vmChooser->currentIndex() == 0){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("似乎无法找到 UEFI 固件,是否继续创建虚拟机?\nQemu 固件可以在“安装 Qemu”处安装")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!dir.exists()){
|
|
||||||
dir.mkpath(QDir::homePath() + "/.config/deepin-wine-runner");
|
|
||||||
}
|
|
||||||
if(!QFile::exists(QDir::homePath() + "/.config/deepin-wine-runner/QEMU-EFI")){
|
|
||||||
// 写入用于识别的空文件
|
|
||||||
file.open(QIODevice::WriteOnly);
|
|
||||||
file.write("1");
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
if(ui->vmChooser->currentIndex() == 0){
|
|
||||||
QMessageBox::warning(this, tr("提示"), tr("Qemu 不支持该选项!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
if(ui->vmChooser->currentIndex() == 1){
|
|
||||||
QMessageBox::warning(this, tr("提示"), tr("VirtualBox 不支持该选项!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
archFile.open(QIODevice::WriteOnly);
|
|
||||||
archFile.write("armhf");
|
|
||||||
archFile.close();
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
if(ui->vmChooser->currentIndex() == 1){
|
|
||||||
QMessageBox::warning(this, tr("提示"), tr("VirtualBox 不支持该选项!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
archFile.open(QIODevice::WriteOnly);
|
|
||||||
archFile.write("aarch64");
|
|
||||||
archFile.close();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if(ui->vmChooser->currentIndex() == 0 && QFile::exists(QDir::homePath() + "/.config/deepin-wine-runner/QEMU-EFI")){
|
|
||||||
QFile::remove(QDir::homePath() + "/.config/deepin-wine-runner/QEMU-EFI");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildvbox(ui->isoPath->text(), ui->systemVersion->currentIndex(), ui->vmChooser->currentIndex());
|
|
||||||
ui->tabWidget->setCurrentIndex(1);
|
|
||||||
stopShowTime = 1;
|
|
||||||
ui->CPUValue->showMessage(tr("提示:目前已经尝试开启虚拟机,如果在一段时间后依旧还没看到虚拟机窗口开启,请在菜单栏查看虚拟机日志"), 10000);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_getvbox_clicked()
|
|
||||||
{
|
|
||||||
QDesktopServices::openUrl(QUrl("https://www.virtualbox.org/wiki/Linux_Downloads"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_getQemu_clicked()
|
|
||||||
{
|
|
||||||
system(("python3 '" + QCoreApplication::applicationDirPath() + "/../RunCommandWithTerminal.py' pkexec '" + QCoreApplication::applicationDirPath() + "/../QemuSystemInstall.sh'").toLatin1());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_vmChooser_currentIndexChanged(int index)
|
|
||||||
{
|
|
||||||
ui->qemuSetting->setDisabled(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_qemuSetting_clicked()
|
|
||||||
{
|
|
||||||
QemuSetting *show = new QemuSetting();
|
|
||||||
show->show();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_addQemuDisk_triggered()
|
|
||||||
{
|
|
||||||
if(QFile::exists(QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("磁盘文件已存在,是否覆盖?\n覆盖后将无法恢复!")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QString path = QFileDialog::getOpenFileName(this, tr("选择 Qemu 镜像"), QDir::homePath(), tr("Qemu镜像(*.qcow2 *.img *.raw *.qcow *.qed *.vdi *.vhdx *.vmdk);;所有文件(*.*)"));
|
|
||||||
qDebug() << path;
|
|
||||||
if(path == ""){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QDir dir(QDir::homePath() + "/Qemu/Windows");
|
|
||||||
if(!dir.exists()){
|
|
||||||
dir.mkpath(QDir::homePath() + "/Qemu/Windows");
|
|
||||||
}
|
|
||||||
if(QFile::exists(QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
if(!QFile::remove(QDir::homePath() + "/Qemu/Windows/Windows.qcow2") | !QFile::copy(path, QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
QMessageBox::critical(this, tr("提示"), tr("添加错误!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if(!QFile::copy(path, QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
QMessageBox::critical(this, tr("提示"), tr("添加错误!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("添加完成!"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_delQemuDisk_triggered()
|
|
||||||
{
|
|
||||||
if(!QFile::exists(QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("不存在磁盘文件,无法导出"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::system(("xdg-open \"" + QDir::homePath() + "/Qemu/Windows/\"").toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_addQemuDiskButton_clicked()
|
|
||||||
{
|
|
||||||
MainWindow::on_addQemuDisk_triggered();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_saveQemuDiskButton_clicked()
|
|
||||||
{
|
|
||||||
MainWindow::on_delQemuDisk_triggered();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_delQemuDiskButton_clicked()
|
|
||||||
{
|
|
||||||
if(!QFile::exists(QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("不存在磁盘文件,无法移除"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(QMessageBox::question(this, tr("提示"), tr("是否删除?\n删除后将无法恢复!")) == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(!QFile::remove(QDir::homePath() + "/Qemu/Windows/Windows.qcow2")){
|
|
||||||
QMessageBox::critical(this, tr("提示"), tr("移除失败"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("移除成功"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_kvmTest_clicked()
|
|
||||||
{
|
|
||||||
if(system("which kvm-ok")&& !QFile::exists(QCoreApplication::applicationDirPath() + "/kvm-ok")){
|
|
||||||
QMessageBox::critical(this, tr("错误"), tr("未识别到命令 kvm-ok\n可以使用命令 sudo apt install cpu-checker 安装"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QString kvm_ok_path = "kvm-ok";
|
|
||||||
if(!system("which kvm-ok")){
|
|
||||||
kvm_ok_path = "kvm-ok";
|
|
||||||
}
|
|
||||||
else if(QFile::exists(QCoreApplication::applicationDirPath() + "/kvm-ok")){
|
|
||||||
kvm_ok_path = QCoreApplication::applicationDirPath() + "/kvm-ok";
|
|
||||||
}
|
|
||||||
qDebug() << tr("使用") << kvm_ok_path;
|
|
||||||
QProcess process;
|
|
||||||
process.start(kvm_ok_path);
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
if(process.exitCode()){
|
|
||||||
QMessageBox::critical(this, tr("错误"), tr("您的系统不支持使用 kvm:\n") + process.readAll());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("您的系统支持使用 kvm:\n") + process.readAll());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionVMLog_triggered(){}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionVMRunlLog_triggered()
|
|
||||||
{
|
|
||||||
QFile file("/tmp/windows-virtual-machine-installer-for-wine-runner-run.log");
|
|
||||||
if(!file.exists()){
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("没有日志文件"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
file.open(QIODevice::ReadOnly);
|
|
||||||
QInputDialog::getMultiLineText(this, tr("运行日志"), tr("虚拟机运行日志"), file.readAll());
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionVMTest_triggered()
|
|
||||||
{
|
|
||||||
// 运行 Demo
|
|
||||||
if(QFile::exists(QCoreApplication::applicationDirPath() + "/test.qcow2")){
|
|
||||||
// 优先使用本地的磁盘
|
|
||||||
system(("qemu-system-i386 --hda '" + QCoreApplication::applicationDirPath() + "/test.qcow2' -rtc base=localtime > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1").toUtf8());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 写入 disk 文件
|
|
||||||
QFile file(":/TestDisk/test.qcow2");
|
|
||||||
// 计算随机数
|
|
||||||
QFile writeFile("/tmp/indows-virtual-machine-installer-for-wine-runner-test-disk.qcow2");
|
|
||||||
file.open(QIODevice::ReadOnly);
|
|
||||||
writeFile.open(QIODevice::WriteOnly);
|
|
||||||
writeFile.write(file.readAll());
|
|
||||||
file.close();
|
|
||||||
writeFile.close();
|
|
||||||
system("qemu-system-i386 --hda /tmp/indows-virtual-machine-installer-for-wine-runner-test-disk.qcow2 -rtc base=localtime > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionVMInstallLog_triggered()
|
|
||||||
{
|
|
||||||
QFile file("/tmp/windows-virtual-machine-installer-for-wine-runner-install.log");
|
|
||||||
if(!file.exists()){
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("没有日志文件"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
file.open(QIODevice::ReadOnly);
|
|
||||||
QInputDialog::getMultiLineText(this, tr("安装日志"), tr("虚拟机安装日志"),file.readAll());
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_action_StopVirtualBox_triggered()
|
|
||||||
{
|
|
||||||
vbox vmControl("");
|
|
||||||
vmControl.Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_action_StopQemu_triggered()
|
|
||||||
{
|
|
||||||
qemu vmControl("");
|
|
||||||
vmControl.Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionQemuDiskAddSpace_triggered()
|
|
||||||
{
|
|
||||||
double data = QInputDialog::getDouble(this, tr("磁盘扩容"), "输入扩容多少GB\n注:1、扩容所需要的时间较长,程序可能会出现假死的情况,请不要关闭否则会导致虚拟磁盘损坏\n2、扩展后需要自行在虚拟机使用 Deepin Community Live CD、Live CD、Windows PE\n等工具调整系统分区大小才能使用");
|
|
||||||
if(data <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 开始扩容
|
|
||||||
int result = qemu("").AddDiskSpace(QDir::homePath() + "/Qemu/Windows/Windows.qcow2", data);
|
|
||||||
qDebug() << "Exit Code: " << result;
|
|
||||||
if(result) {
|
|
||||||
QMessageBox::critical(this, tr("错误"), tr("扩容失败!"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QMessageBox::information(this, tr("提示"), tr("扩容完成!"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_getDCLC_triggered()
|
|
||||||
{
|
|
||||||
QDesktopServices::openUrl(QUrl("https://github.com/gfdgd-xi/deepin-community-live-cd/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#ifndef MAINWINDOW_H
|
|
||||||
#define MAINWINDOW_H
|
|
||||||
|
|
||||||
#include <QMainWindow>
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class MainWindow;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit MainWindow(QWidget *parent = nullptr);
|
|
||||||
~MainWindow();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void ShowCPUMessage();
|
|
||||||
void on_browser_clicked();
|
|
||||||
QString GetRunCommand(QString command);
|
|
||||||
void on_install_clicked();
|
|
||||||
|
|
||||||
|
|
||||||
void on_getvbox_clicked();
|
|
||||||
|
|
||||||
void on_getQemu_clicked();
|
|
||||||
|
|
||||||
void on_vmChooser_currentIndexChanged(int index);
|
|
||||||
|
|
||||||
void on_qemuSetting_clicked();
|
|
||||||
|
|
||||||
void on_addQemuDisk_triggered();
|
|
||||||
|
|
||||||
void on_delQemuDisk_triggered();
|
|
||||||
|
|
||||||
void on_addQemuDiskButton_clicked();
|
|
||||||
|
|
||||||
void on_saveQemuDiskButton_clicked();
|
|
||||||
|
|
||||||
void on_delQemuDiskButton_clicked();
|
|
||||||
|
|
||||||
void on_kvmTest_clicked();
|
|
||||||
|
|
||||||
void on_actionVMLog_triggered();
|
|
||||||
|
|
||||||
void on_actionVMRunlLog_triggered();
|
|
||||||
|
|
||||||
void on_actionVMTest_triggered();
|
|
||||||
|
|
||||||
void on_actionVMInstallLog_triggered();
|
|
||||||
|
|
||||||
void on_action_StopVirtualBox_triggered();
|
|
||||||
|
|
||||||
void on_action_StopQemu_triggered();
|
|
||||||
|
|
||||||
void on_actionQemuDiskAddSpace_triggered();
|
|
||||||
|
|
||||||
void on_getDCLC_triggered();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool stopShowTime = 0;
|
|
||||||
Ui::MainWindow *ui;
|
|
||||||
long m_cpuAll;
|
|
||||||
long m_cpuFree;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
|
||||||
@@ -1,355 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
*/
|
|
||||||
#include "qemu.h"
|
|
||||||
#include <QDir>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include "command.h"
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <iostream>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
qemu::qemu(QString name, QString managerPath)
|
|
||||||
{
|
|
||||||
if(!QFile::exists(name)){
|
|
||||||
this->name = QDir::homePath() + "/Qemu/" + name;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
this->name = name;
|
|
||||||
}
|
|
||||||
this->managerPath = managerPath;
|
|
||||||
//Command command = Command();
|
|
||||||
QString qemuPath = "qemu-system-i386";
|
|
||||||
if(QFile::exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh")) {
|
|
||||||
// 如果存在拓展 Qemu,则调用此
|
|
||||||
qemuPath = "/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh qemu-system-i386";
|
|
||||||
}
|
|
||||||
this->vboxVersion = Command().GetCommand(qemuPath + " --version");
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::Create(QString type)
|
|
||||||
{
|
|
||||||
if(!QFile::exists(this->name)){
|
|
||||||
QDir dir(this->name);
|
|
||||||
dir.mkpath(this->name);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::CreateDisk(QString path, int size)
|
|
||||||
{
|
|
||||||
if(QFile::exists(path)){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return system(("qemu-img create -f qcow2 '" + path + "' " + QString::number(size) + "M").toLatin1());
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::CreateDiskControl(QString controlName)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::MountDisk(QString diskPath, QString controlName, int port, int device)
|
|
||||||
{
|
|
||||||
commandOption += "-drive 'file=" + diskPath + ",if=ide,index=" + QString::number(device) + "' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::MountISO(QString isoPath, QString controlName, int port, int device)
|
|
||||||
{
|
|
||||||
commandOption += "-drive 'media=cdrom,file=" + isoPath + ",if=ide,index=" + QString::number(device) + "' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::BootFirst(QString bootDrive)
|
|
||||||
{
|
|
||||||
commandOption += "-boot '" + bootDrive + "' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetNetBridge(QString netDriver)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetCPU(int number, int cpuNum, int coreNum)
|
|
||||||
{
|
|
||||||
// commandOption += "-smp " + QString::number(number) + " ";
|
|
||||||
// 调整调用方法
|
|
||||||
//qDebug() << number << " " << cpuNum << " " << coreNum;
|
|
||||||
qDebug() << "Socket: " << cpuNum;
|
|
||||||
qDebug() << "Core: " << coreNum;
|
|
||||||
qDebug() << "Threads: " << number;
|
|
||||||
commandOption += "-smp " + QString::number(number) + ",sockets=" + QString::number(cpuNum) + ",cores=" + QString::number(coreNum / cpuNum) + ",threads=" + QString::number(number / cpuNum / coreNum) + " ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetMemory(int memory)
|
|
||||||
{
|
|
||||||
commandOption += "-m " + QString::number(memory) + "M ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetRemote(bool setting)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetRemoteConnectSetting(int port)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::MountMainDisk(QString diskPath)
|
|
||||||
{
|
|
||||||
commandOption += " --hda '" + diskPath + "' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::StartArmhf()
|
|
||||||
{
|
|
||||||
qDebug() << commandOption;
|
|
||||||
QString qemuPath = "qemu-system-arm";
|
|
||||||
if(QFile::exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh")) {
|
|
||||||
// 如果存在拓展 Qemu,则调用此
|
|
||||||
qemuPath = "/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh qemu-system-arm";
|
|
||||||
}
|
|
||||||
if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "aarch64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){
|
|
||||||
return system((qemuPath + " --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((qemuPath + " --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 = "";
|
|
||||||
QString qemuPath = "qemu-system-aarch64";
|
|
||||||
// 判断 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";
|
|
||||||
}
|
|
||||||
if(QFile::exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh")) {
|
|
||||||
// 如果存在拓展 Qemu,则调用此
|
|
||||||
qemuPath = "/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh qemu-system-aarch64";
|
|
||||||
}
|
|
||||||
qDebug() << commandOption;
|
|
||||||
if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "aarch64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){
|
|
||||||
return system((qemuPath + " --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((qemuPath + " --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;
|
|
||||||
QString qemuPath = "qemu-system-x86_64";
|
|
||||||
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 ";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
newCommandOption += " -vga virtio -device nec-usb-xhci,id=xhci,addr=0x1b -device usb-tablet,id=tablet,bus=xhci.0,port=1 ";
|
|
||||||
}
|
|
||||||
// UOS 3a4000 使用程序自带的 qemu
|
|
||||||
QString info = SystemInfo().toLower();
|
|
||||||
if(info.contains("uos") || info.contains("unio")) {
|
|
||||||
// 判断架构
|
|
||||||
QString arch = GetArch();
|
|
||||||
if(arch == "mips64" || arch == "mipsel64") {
|
|
||||||
qemuPath = "bwrap --dev-bind / / --bind '" + QCoreApplication::applicationDirPath() + "/MipsQemu/usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so' /usr/lib/mips64el-linux-gnuabi64/qemu/ui-gtk.so '" + QCoreApplication::applicationDirPath() + "/MipsQemu/usr/bin/qemu-system-x86_64' ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(QFile::exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh")) {
|
|
||||||
// 如果存在拓展 Qemu,则调用此
|
|
||||||
qemuPath = "/opt/apps/deepin-wine-runner-qemu-system-extra/files/run.sh qemu-system-x86_64";
|
|
||||||
}
|
|
||||||
qDebug() << commandOption;
|
|
||||||
if(Command().GetCommand("arch").replace("\n", "").replace(" ", "") == "x86_64" && !system((QCoreApplication::applicationDirPath() + "/kvm-ok").toUtf8())){
|
|
||||||
return system((qemuPath + " --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((qemuPath + " --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()
|
|
||||||
{
|
|
||||||
system("killall qemu-system-x86_64 -9");
|
|
||||||
system("killall qemu-system-aarch64 -9");
|
|
||||||
system("killall qemu-system-arm -9");
|
|
||||||
system("killall kvm -9");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::Delete()
|
|
||||||
{
|
|
||||||
return system(("rm -rfv '" + name + "'").toLatin1());
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetDisplayMemory(int memory)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::InstallGuessAdditions(QString controlName, int port, int device)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::EnabledAudio()
|
|
||||||
{
|
|
||||||
commandOption += "-device AC97 -device ES1370 -device intel-hda -device hda-duplex ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::EnabledClipboardMode()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::EnabledDraganddrop()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::ShareFile(QString name, QString path)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetVBoxSVGA()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetMousePS2()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::SetKeyboardPS2()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::OpenUSB()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::UseAarch64EFI()
|
|
||||||
{
|
|
||||||
if(QFile::exists("/usr/share/qemu-efi-aarch64/QEMU_EFI.fd")){
|
|
||||||
commandOption += "--bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(QFile::exists(QCoreApplication::applicationDirPath() + "/QEMU_AARCH64_EFI.fd")){
|
|
||||||
commandOption += "--bios '" + QCoreApplication::applicationDirPath() + "/QEMU_AARCH64_EFI.fd' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::UseArmhfEFI()
|
|
||||||
{
|
|
||||||
if(QFile::exists("/usr/share/AAVMF/AAVMF32_CODE.fd")){
|
|
||||||
commandOption += "--bios /usr/share/AAVMF/AAVMF32_CODE.fd ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(QFile::exists(QCoreApplication::applicationDirPath() + "/AAVMF32_CODE.fd")){
|
|
||||||
commandOption += "--bios '" + QCoreApplication::applicationDirPath() + "/AAVMF32_CODE.fd' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::UseLoongarch64EFI()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::UseOtherEFI(QString fdFilePath)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::EnabledUEFI(bool status)
|
|
||||||
{
|
|
||||||
isUEFI = status;
|
|
||||||
if(!status){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(QFile::exists("/usr/share/qemu/OVMF.fd")){
|
|
||||||
commandOption += "--bios /usr/share/qemu/OVMF.fd ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(QFile::exists(QCoreApplication::applicationDirPath() + "/OVMF.fd")){
|
|
||||||
commandOption += "--bios '" + QCoreApplication::applicationDirPath() + "/OVMF.fd' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::MountMainISO(QString isoPath)
|
|
||||||
{
|
|
||||||
commandOption += "--cdrom '" + isoPath + "' ";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qemu::AutoInstall(QString iso)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString qemu::SystemInfo()
|
|
||||||
{
|
|
||||||
QFile file("/etc/os-version");
|
|
||||||
file.open(QFile::ReadOnly);
|
|
||||||
QString data = file.readAll();
|
|
||||||
file.close();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString qemu::GetArch()
|
|
||||||
{
|
|
||||||
QProcess process;
|
|
||||||
process.start("uname", QStringList() << "-m");
|
|
||||||
process.waitForStarted();
|
|
||||||
process.waitForFinished();
|
|
||||||
QString data = process.readAllStandardOutput();
|
|
||||||
process.close();
|
|
||||||
return data.replace("\n", "").replace(" ", "");
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#ifndef QEMU_H
|
|
||||||
#define QEMU_H
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class qemu
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// 虚拟机信息
|
|
||||||
QString name;
|
|
||||||
QString managerPath;
|
|
||||||
QString vboxVersion;
|
|
||||||
qemu(QString name, QString managerPath="/usr/bin");
|
|
||||||
int Create(QString type="Windows7");
|
|
||||||
int CreateDisk(QString path, int size);
|
|
||||||
int CreateDiskControl(QString controlName="storage_controller_1");
|
|
||||||
int MountDisk(QString diskPath, QString controlName="storage_controller_1", int port=0, int device=0);
|
|
||||||
int MountISO(QString isoPath, QString controlName="storage_controller_1", int port=1, int device=0);
|
|
||||||
int BootFirst(QString bootDrive);
|
|
||||||
int SetNetBridge(QString netDriver);
|
|
||||||
int SetCPU(int number, int cpuNum, int coreNum);
|
|
||||||
int SetMemory(int memory);
|
|
||||||
int SetRemote(bool setting);
|
|
||||||
int SetRemoteConnectSetting(int port=5540);
|
|
||||||
int Start(bool unShown=false);
|
|
||||||
int StartArmhf();
|
|
||||||
int StartAarch64();
|
|
||||||
int StartLoong64();
|
|
||||||
int MountMainDisk(QString diskPath);
|
|
||||||
int Stop();
|
|
||||||
int Delete();
|
|
||||||
int SetDisplayMemory(int memory);
|
|
||||||
int InstallGuessAdditions(QString controlName="storage_controller_1", int port=1, int device=0);
|
|
||||||
int EnabledAudio();
|
|
||||||
int EnabledClipboardMode();
|
|
||||||
int EnabledDraganddrop();
|
|
||||||
int ShareFile(QString name, QString path);
|
|
||||||
int SetVBoxSVGA();
|
|
||||||
int SetMousePS2();
|
|
||||||
int SetKeyboardPS2();
|
|
||||||
int OpenUSB();
|
|
||||||
int EnabledUEFI(bool status);
|
|
||||||
int AutoInstall(QString iso);
|
|
||||||
int MountMainISO(QString isoPath);
|
|
||||||
int UseAarch64EFI();
|
|
||||||
int UseArmhfEFI();
|
|
||||||
int UseLoongarch64EFI();
|
|
||||||
int UseOtherEFI(QString fdFilePath);
|
|
||||||
int AddDiskSpace(QString path, double data);
|
|
||||||
private:
|
|
||||||
QString commandOption = "";
|
|
||||||
bool isUEFI = false;
|
|
||||||
QString GetBootLogoPath();
|
|
||||||
QString SystemInfo();
|
|
||||||
QString GetArch();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // QEMU_H
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
#include "qemusetting.h"
|
|
||||||
#include "ui_qemusetting.h"
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QFile>
|
|
||||||
#include "infoutils.h"
|
|
||||||
#include <QDir>
|
|
||||||
#include <sys/sysinfo.h>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
QemuSetting::QemuSetting(QWidget *parent) :
|
|
||||||
QWidget(parent),
|
|
||||||
ui(new Ui::QemuSetting)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
// 判断是否安装了 Wine 运行器
|
|
||||||
ui->getrunner->setHidden(QFile::exists(QCoreApplication::applicationDirPath() + "/../mainwindow.py"));
|
|
||||||
// 设置变量
|
|
||||||
if(QFile::exists(QDir::homePath() + "/.config/deepin-wine-runner/QemuSetting.json")){
|
|
||||||
// 读取配置文件
|
|
||||||
QFile file(QDir::homePath() + "/.config/deepin-wine-runner/QemuSetting.json");
|
|
||||||
file.open(QIODevice::ReadOnly);
|
|
||||||
QJsonParseError error;
|
|
||||||
QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &error);
|
|
||||||
file.close();
|
|
||||||
if(error.error != QJsonParseError::NoError){
|
|
||||||
QMessageBox::critical(this, "错误", error.errorString());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
QJsonObject object = document.object();
|
|
||||||
qDebug() << QJsonDocument(object).toJson();
|
|
||||||
ui->enableKvm->setChecked(object.value("EnableKVM").toBool());
|
|
||||||
ui->enableRdp->setChecked(object.value("EnableRDP").toBool());
|
|
||||||
ui->enableVnc->setChecked(object.value("EnableVNC").toBool());
|
|
||||||
ui->enableSound->setChecked(object.value("EnableSound").toBool());
|
|
||||||
ui->memoryNumber->setValue(object.value("Memory").toInt());
|
|
||||||
ui->vncNumber->setValue(object.value("VNC").toInt());
|
|
||||||
ui->cpuNumber->setValue(object.value("CPU").toInt());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// 默认
|
|
||||||
this->SetDefaultValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::SetDefaultValue(){
|
|
||||||
long memory = 0;
|
|
||||||
long memoryAll = 0;
|
|
||||||
long swap = 0;
|
|
||||||
long swapAll = 0;
|
|
||||||
infoUtils::memoryRate(memory, memoryAll, swap, swapAll);
|
|
||||||
ui->memoryNumber->setValue(memoryAll / 3 / 1024);
|
|
||||||
ui->vncNumber->setValue(5);
|
|
||||||
ui->cpuNumber->setValue(get_nprocs());
|
|
||||||
ui->enableKvm->setChecked(true);
|
|
||||||
ui->enableRdp->setChecked(true);
|
|
||||||
ui->enableVnc->setChecked(true);
|
|
||||||
ui->enableSound->setChecked(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
QemuSetting::~QemuSetting()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_buttonBox_accepted()
|
|
||||||
{
|
|
||||||
QMessageBox::information(NULL, "", "");
|
|
||||||
acceptDrops();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_save_clicked()
|
|
||||||
{
|
|
||||||
QJsonParseError error;
|
|
||||||
QJsonDocument document = QJsonDocument::fromJson("{}", &error);
|
|
||||||
if(error.error != QJsonParseError::NoError){
|
|
||||||
QMessageBox::critical(this, "错误", error.errorString());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QJsonObject object = document.object();
|
|
||||||
//object.insert("1", QJsonValue("aa"));
|
|
||||||
object.insert("EnableKVM", ui->enableKvm->isChecked());
|
|
||||||
object.insert("EnableRDP", ui->enableRdp->isChecked());
|
|
||||||
object.insert("EnableVNC", ui->enableVnc->isChecked());
|
|
||||||
object.insert("EnableSound", ui->enableSound->isChecked());
|
|
||||||
object.insert("Memory", ui->memoryNumber->value());
|
|
||||||
object.insert("VNC", ui->vncNumber->value());
|
|
||||||
object.insert("CPU", ui->cpuNumber->value());
|
|
||||||
qDebug() << QJsonDocument(object).toJson();
|
|
||||||
// 读取配置文件
|
|
||||||
QDir dir(QDir::homePath() + "/.config/deepin-wine-runner/");
|
|
||||||
if(!dir.exists()){
|
|
||||||
dir.mkpath(QDir::homePath() + "/.config/deepin-wine-runner/");
|
|
||||||
}
|
|
||||||
QFile file(QDir::homePath() + "/.config/deepin-wine-runner/QemuSetting.json");
|
|
||||||
file.open(QIODevice::WriteOnly);
|
|
||||||
file.write(QJsonDocument(object).toJson());
|
|
||||||
file.close();
|
|
||||||
QMessageBox::information(this, "提示", "保存完成!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_cancel_clicked()
|
|
||||||
{
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_getrunner_clicked()
|
|
||||||
{
|
|
||||||
QDesktopServices::openUrl(QUrl("https://gitee.com/gfdgd-xi/deep-wine-runner/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_enableVnc_stateChanged(int arg1)
|
|
||||||
{
|
|
||||||
// 控件的开启/关闭
|
|
||||||
ui->vncNumber->setEnabled(ui->enableVnc->isChecked());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QemuSetting::on_setDefault_clicked()
|
|
||||||
{
|
|
||||||
if(QMessageBox::question(this, "提示", "你确定要重置为默认?重置后将无法恢复") == QMessageBox::No){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QFile::remove(QDir::homePath() + "/.config/deepin-wine-runner/QemuSetting.json");
|
|
||||||
this->SetDefaultValue();
|
|
||||||
QMessageBox::information(this, "提示", "设置完成!");
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#ifndef QEMUSETTING_H
|
|
||||||
#define QEMUSETTING_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QCheckBox>
|
|
||||||
#include <QSpinBox>
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class QemuSetting;
|
|
||||||
}
|
|
||||||
|
|
||||||
class QemuSetting : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit QemuSetting(QWidget *parent = nullptr);
|
|
||||||
~QemuSetting();
|
|
||||||
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void on_buttonBox_accepted();
|
|
||||||
|
|
||||||
void on_save_clicked();
|
|
||||||
|
|
||||||
void on_cancel_clicked();
|
|
||||||
|
|
||||||
void on_getrunner_clicked();
|
|
||||||
|
|
||||||
void on_enableVnc_stateChanged(int arg1);
|
|
||||||
|
|
||||||
void on_setDefault_clicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SetDefaultValue();
|
|
||||||
Ui::QemuSetting *ui;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // QEMUSETTING_H
|
|
||||||
@@ -1,210 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>QemuSetting</class>
|
|
||||||
<widget class="QWidget" name="QemuSetting">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>496</width>
|
|
||||||
<height>300</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>设置</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="9" column="1">
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string><h3>远程服务</h3></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>VNC服务端口:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QCheckBox" name="enableRdp">
|
|
||||||
<property name="text">
|
|
||||||
<string>开启 rdp 服务映射</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>内存大小(MB):</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QSpinBox" name="memoryNumber">
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999999</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="1">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<widget class="QSpinBox" name="vncNumber">
|
|
||||||
<property name="maximum">
|
|
||||||
<number>9999</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="text">
|
|
||||||
<string><h3>基础设置</h3></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QCheckBox" name="enableVnc">
|
|
||||||
<property name="text">
|
|
||||||
<string>开启VNC服务</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="enableKvm">
|
|
||||||
<property name="text">
|
|
||||||
<string>开启 kvm 加速</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>CPU核心数:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QSpinBox" name="cpuNumber">
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999999</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QCheckBox" name="enableSound">
|
|
||||||
<property name="text">
|
|
||||||
<string>开启声音</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetDefaultConstraint</enum>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="save">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>保存</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cancel">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>取消</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="setDefault">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>重置
|
|
||||||
默认</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="getrunner">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>获取
|
|
||||||
Wine
|
|
||||||
运行器</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
||||||
BIN
VM-source/run
@@ -1,22 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <filesystem>
|
|
||||||
using namespace std;
|
|
||||||
// 清屏
|
|
||||||
void CleanScreen(){
|
|
||||||
/*if(filesystem::exists("/")){
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
system("clear");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]){
|
|
||||||
// 判断参数是否齐全
|
|
||||||
CleanScreen();
|
|
||||||
//
|
|
||||||
if(argc < 3) {
|
|
||||||
cout << "参数不齐!" << endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
cout << argc << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import os
|
|
||||||
import api
|
|
||||||
import sys
|
|
||||||
import psutil
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
os.system("clear")
|
|
||||||
programPath = os.path.split(os.path.realpath(__file__))[0]
|
|
||||||
if len(sys.argv) < 3 :
|
|
||||||
print("参数不齐!")
|
|
||||||
exit()
|
|
||||||
net = ""
|
|
||||||
for k, v in psutil.net_if_addrs().items():
|
|
||||||
for item in v:
|
|
||||||
if item[0] == 2 and not item[1] == "127.0.0.1" and not item[1] == "192.168.250.1":
|
|
||||||
net = k
|
|
||||||
break
|
|
||||||
if net == "":
|
|
||||||
exit()
|
|
||||||
# 创建一个叫Windows的虚拟机
|
|
||||||
vm = api.Manager("Windows")
|
|
||||||
if sys.argv[2] == "0":
|
|
||||||
vm.Create("Windows7")
|
|
||||||
elif sys.argv[2] == "1":
|
|
||||||
vm.Create("Windows7_64")
|
|
||||||
else:
|
|
||||||
vm.Create("WindowsNT_64")
|
|
||||||
vm.CreateDisk(f"{api.homePath}/VirtualBox VMs/Windows/Windows.vdi", 131072)
|
|
||||||
vm.CreateDiskControl()
|
|
||||||
vm.MountDisk(f"{api.homePath}/VirtualBox VMs/Windows/Windows.vdi")
|
|
||||||
vm.MountISO(sys.argv[1])
|
|
||||||
if sys.argv[2] == "0":
|
|
||||||
vm.MountISO(f"{programPath}/Windows7X86Auto.iso", device=1)
|
|
||||||
elif sys.argv[2] == "1":
|
|
||||||
vm.MountISO(f"{programPath}/Windows7X64Auto.iso", device=1)
|
|
||||||
vm.SetCPU(1)
|
|
||||||
vm.SetMemory(psutil.virtual_memory().total // 1024 // 1024 // 3)
|
|
||||||
vm.SetDisplayMemory(32)
|
|
||||||
vm.SetNetBridge(net)
|
|
||||||
vm.EnabledAudio()
|
|
||||||
vm.EnabledClipboardMode()
|
|
||||||
vm.EnabledDraganddrop()
|
|
||||||
vm.SetVBoxSVGA()
|
|
||||||
vm.SetMousePS2()
|
|
||||||
vm.SetKeyboardPS2()
|
|
||||||
vm.OpenUSB()
|
|
||||||
vm.ShareFile("ROOT", "/")
|
|
||||||
vm.ShareFile("HOME", api.homePath)
|
|
||||||
vm.Start()
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file>zh_CN.qm</file>
|
|
||||||
<file>zh_CN.ts</file>
|
|
||||||
<file>en_US.qm</file>
|
|
||||||
<file>en_US.ts</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
*/
|
|
||||||
#include "vbox.h"
|
|
||||||
#include "command.h"
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
vbox::vbox(QString name, QString managerPath) {
|
|
||||||
this->name = name;
|
|
||||||
this->managerPath = managerPath;
|
|
||||||
//Command command = Command();
|
|
||||||
this->vboxVersion = Command().GetCommand("'" + managerPath + "' -v");
|
|
||||||
}
|
|
||||||
|
|
||||||
int vbox::Create(QString type){
|
|
||||||
system(("\"" + managerPath + "\" createvm --name \""
|
|
||||||
+ name + "\" --ostype \"" + type +
|
|
||||||
"\" --register").toLatin1());
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \""
|
|
||||||
+ name + "\" --ostype \"" + type +
|
|
||||||
"\" ").toLatin1());
|
|
||||||
//vboxmanage modifyvm testvm --ostype
|
|
||||||
}
|
|
||||||
int vbox::CreateDisk(QString path, int size){
|
|
||||||
return system(("\"" + managerPath + "\" createvdi --filename \"" + path + "\" --size \"" + QString::number(size) + "\"").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::CreateDiskControl(QString controlName){
|
|
||||||
return system(("\"" + managerPath + "\" storagectl \"" + name + "\" --name \"" + controlName + "\" --add ide").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::MountDisk(QString diskPath, QString controlName, int port, int device){
|
|
||||||
return system(("\"" + managerPath + "\" storageattach \"" + name +
|
|
||||||
"\" --storagectl \"" + controlName + "\" --type hdd --port "
|
|
||||||
+ QString::number(port) + " --device " + QString::number(device) + " --medium \"" + diskPath + "\"").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::MountISO(QString isoPath, QString controlName, int port, int device){
|
|
||||||
return system(("\"" + managerPath + "\" storageattach \"" + name + "\" --storagectl \"" +
|
|
||||||
controlName + "\" --type dvddrive --port " + QString::number(port) + " --device " + QString::number(device)
|
|
||||||
+ " --medium \"" + isoPath + "\"").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::BootFirst(QString bootDrive){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --boot1 " + bootDrive).toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetNetBridge(QString netDriver){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name +
|
|
||||||
"\" --nic1 bridged --cableconnected1 on --nictype1 82540EM --bridgeadapter1 \"" + netDriver + "\" --intnet1 brigh1 --macaddress1 auto").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetCPU(int number, int cpuNum, int coreNum){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --cpus " + QString::number(number)).toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetMemory(int memory){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --memory " + QString::number(memory)).toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetRemote(bool setting){
|
|
||||||
if(setting){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --vrde on").toLatin1());
|
|
||||||
}
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --vrde off").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetRemoteConnectSetting(int port){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --vrdeport " + QString::number(port) + " --vrdeaddress """).toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::Start(bool unShown){
|
|
||||||
if(unShown){
|
|
||||||
return system(("\"" + managerPath + "\" > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1").toLatin1());
|
|
||||||
}
|
|
||||||
return system(("\"" + managerPath + "\" startvm \"" + name + "\" > /tmp/windows-virtual-machine-installer-for-wine-runner-install.log 2>&1").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::Stop(){
|
|
||||||
return system(("\"" + managerPath + "\" controlvm \"" + name + "\" poweroff").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::Delete(){
|
|
||||||
return system(("\"" + managerPath + "\" unregistervm --delete \"" + name + "\"").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetDisplayMemory(int memory){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --vram " + QString::number(memory)).toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::InstallGuessAdditions(QString controlName, int port, int device){
|
|
||||||
return MountISO("/usr/share/virtualbox/VBoxGuestAdditions.iso", controlName, port, device);
|
|
||||||
}
|
|
||||||
int vbox::EnabledAudio(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --audio-driver pulse --audiocontroller hda --audioin on --audioout on").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::EnabledClipboardMode(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --clipboard-mode bidirectional").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::EnabledDraganddrop(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --draganddrop bidirectional").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::ShareFile(QString name, QString path){
|
|
||||||
return system(("\"" + managerPath + "\" sharedfolder add \"" + this->name + "\" -name \"" + name + "\" -hostpath \"" + path + "\"").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetVBoxSVGA(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --graphicscontroller vboxsvga").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetMousePS2(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --mouse usb").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::SetKeyboardPS2(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --keyboard usb").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::OpenUSB(){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --usbohci on").toLatin1());
|
|
||||||
}
|
|
||||||
|
|
||||||
int vbox::EnabledUEFI(bool status){
|
|
||||||
if(status){
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --firmware=efi").toLatin1());
|
|
||||||
}
|
|
||||||
return system(("\"" + managerPath + "\" modifyvm \"" + name + "\" --firmware=bios").toLatin1());
|
|
||||||
}
|
|
||||||
int vbox::AutoInstall(QString iso){
|
|
||||||
return system(("vboxmanage unattended install '" + name + "' '--iso=" + iso + "'").toLatin1());
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* gfdgd xi
|
|
||||||
* 依照 GPLV3 开源
|
|
||||||
*/
|
|
||||||
#ifndef VBOX_H
|
|
||||||
#define VBOX_H
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class vbox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// 虚拟机信息
|
|
||||||
QString name;
|
|
||||||
QString managerPath;
|
|
||||||
QString vboxVersion;
|
|
||||||
vbox(QString name, QString managerPath="VBoxManage");
|
|
||||||
int Create(QString type="Windows7");
|
|
||||||
int CreateDisk(QString path, int size);
|
|
||||||
int CreateDiskControl(QString controlName="storage_controller_1");
|
|
||||||
int MountDisk(QString diskPath, QString controlName="storage_controller_1", int port=0, int device=0);
|
|
||||||
int MountISO(QString isoPath, QString controlName="storage_controller_1", int port=1, int device=0);
|
|
||||||
int BootFirst(QString bootDrive);
|
|
||||||
int SetNetBridge(QString netDriver);
|
|
||||||
int SetCPU(int number, int cpuNum, int coreNum);
|
|
||||||
int SetMemory(int memory);
|
|
||||||
int SetRemote(bool setting);
|
|
||||||
int SetRemoteConnectSetting(int port=5540);
|
|
||||||
int Start(bool unShown=false);
|
|
||||||
int Stop();
|
|
||||||
int Delete();
|
|
||||||
int SetDisplayMemory(int memory);
|
|
||||||
int InstallGuessAdditions(QString controlName="storage_controller_1", int port=1, int device=0);
|
|
||||||
int EnabledAudio();
|
|
||||||
int EnabledClipboardMode();
|
|
||||||
int EnabledDraganddrop();
|
|
||||||
int ShareFile(QString name, QString path);
|
|
||||||
int SetVBoxSVGA();
|
|
||||||
int SetMousePS2();
|
|
||||||
int SetKeyboardPS2();
|
|
||||||
int OpenUSB();
|
|
||||||
int EnabledUEFI(bool status);
|
|
||||||
int AutoInstall(QString iso);
|
|
||||||
private:
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // VBOX_H
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
<!--
|
|
||||||
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
|
|
||||||
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
|
|
||||||
virsh edit win7
|
|
||||||
or other application using the libvirt API.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<domain type='kvm'>
|
|
||||||
<name>win7</name>
|
|
||||||
<uuid>721bf798-852e-4e2c-bfa7-c151037433b7</uuid>
|
|
||||||
<metadata>
|
|
||||||
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
|
||||||
<libosinfo:os id="http://microsoft.com/win/7"/>
|
|
||||||
</libosinfo:libosinfo>
|
|
||||||
</metadata>
|
|
||||||
<memory unit='KiB'>4194304</memory>
|
|
||||||
<currentMemory unit='KiB'>4194304</currentMemory>
|
|
||||||
<vcpu placement='static'>2</vcpu>
|
|
||||||
<os>
|
|
||||||
<type arch='x86_64' machine='pc-q35-5.2'>hvm</type>
|
|
||||||
<boot dev='hd'/>
|
|
||||||
</os>
|
|
||||||
<features>
|
|
||||||
<acpi/>
|
|
||||||
<apic/>
|
|
||||||
<hyperv mode='custom'>
|
|
||||||
<relaxed state='on'/>
|
|
||||||
<vapic state='on'/>
|
|
||||||
<spinlocks state='on' retries='8191'/>
|
|
||||||
</hyperv>
|
|
||||||
<vmport state='off'/>
|
|
||||||
</features>
|
|
||||||
<cpu mode='host-model' check='partial'/>
|
|
||||||
<clock offset='localtime'>
|
|
||||||
<timer name='rtc' tickpolicy='catchup'/>
|
|
||||||
<timer name='pit' tickpolicy='delay'/>
|
|
||||||
<timer name='hpet' present='no'/>
|
|
||||||
<timer name='hypervclock' present='yes'/>
|
|
||||||
</clock>
|
|
||||||
<on_poweroff>destroy</on_poweroff>
|
|
||||||
<on_reboot>restart</on_reboot>
|
|
||||||
<on_crash>destroy</on_crash>
|
|
||||||
<pm>
|
|
||||||
<suspend-to-mem enabled='no'/>
|
|
||||||
<suspend-to-disk enabled='no'/>
|
|
||||||
</pm>
|
|
||||||
<devices>
|
|
||||||
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
|
||||||
<disk type='file' device='disk'>
|
|
||||||
<driver name='qemu' type='qcow2'/>
|
|
||||||
<source file='/var/lib/libvirt/images/win7'/>
|
|
||||||
<target dev='sda' bus='sata'/>
|
|
||||||
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
|
||||||
</disk>
|
|
||||||
<disk type='file' device='cdrom'>
|
|
||||||
<driver name='qemu' type='raw'/>
|
|
||||||
<source file='/media/gfdgd_xi/ventoy/XiaYuHao/System-ISO/Windows-ISO/Windows-7/Windows-7-SP1-x86.iso'/>
|
|
||||||
<target dev='sdb' bus='sata'/>
|
|
||||||
<readonly/>
|
|
||||||
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
|
|
||||||
</disk>
|
|
||||||
<disk type='file' device='cdrom'>
|
|
||||||
<driver name='qemu' type='raw'/>
|
|
||||||
<source file='/home/gfdgd_xi/Desktop/deep-wine-runner/VM/Windows7X86自动应答.iso'/>
|
|
||||||
<target dev='sdc' bus='sata'/>
|
|
||||||
<readonly/>
|
|
||||||
<address type='drive' controller='0' bus='0' target='0' unit='2'/>
|
|
||||||
</disk>
|
|
||||||
<controller type='usb' index='0' model='ich9-ehci1'>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x7'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='usb' index='0' model='ich9-uhci1'>
|
|
||||||
<master startport='0'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x0' multifunction='on'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='usb' index='0' model='ich9-uhci2'>
|
|
||||||
<master startport='2'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x1'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='usb' index='0' model='ich9-uhci3'>
|
|
||||||
<master startport='4'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x2'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='sata' index='0'>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='pci' index='0' model='pcie-root'/>
|
|
||||||
<controller type='pci' index='1' model='pcie-root-port'>
|
|
||||||
<model name='pcie-root-port'/>
|
|
||||||
<target chassis='1' port='0x10'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='pci' index='2' model='pcie-root-port'>
|
|
||||||
<model name='pcie-root-port'/>
|
|
||||||
<target chassis='2' port='0x11'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
|
|
||||||
</controller>
|
|
||||||
<controller type='pci' index='3' model='pcie-root-port'>
|
|
||||||
<model name='pcie-root-port'/>
|
|
||||||
<target chassis='3' port='0x12'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
|
|
||||||
</controller>
|
|
||||||
<interface type='direct'>
|
|
||||||
<mac address='52:54:00:a3:d2:72'/>
|
|
||||||
<source dev='enp37s0' mode='bridge'/>
|
|
||||||
<model type='e1000e'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
|
||||||
</interface>
|
|
||||||
<serial type='pty'>
|
|
||||||
<target type='isa-serial' port='0'>
|
|
||||||
<model name='isa-serial'/>
|
|
||||||
</target>
|
|
||||||
</serial>
|
|
||||||
<console type='pty'>
|
|
||||||
<target type='serial' port='0'/>
|
|
||||||
</console>
|
|
||||||
<input type='tablet' bus='usb'>
|
|
||||||
<address type='usb' bus='0' port='1'/>
|
|
||||||
</input>
|
|
||||||
<input type='mouse' bus='ps2'/>
|
|
||||||
<input type='keyboard' bus='ps2'/>
|
|
||||||
<graphics type='spice' autoport='yes'>
|
|
||||||
<listen type='address'/>
|
|
||||||
<image compression='off'/>
|
|
||||||
</graphics>
|
|
||||||
<sound model='ich9'>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
|
|
||||||
</sound>
|
|
||||||
<audio id='1' type='spice'/>
|
|
||||||
<video>
|
|
||||||
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
|
||||||
</video>
|
|
||||||
<redirdev bus='usb' type='spicevmc'>
|
|
||||||
<address type='usb' bus='0' port='2'/>
|
|
||||||
</redirdev>
|
|
||||||
<redirdev bus='usb' type='spicevmc'>
|
|
||||||
<address type='usb' bus='0' port='3'/>
|
|
||||||
</redirdev>
|
|
||||||
<memballoon model='virtio'>
|
|
||||||
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
|
|
||||||
</memballoon>
|
|
||||||
</devices>
|
|
||||||
</domain>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<<3C>d<18><EFBFBD>!<1C>`<60><><EFBFBD>
|
|
||||||
@@ -1,597 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE TS>
|
|
||||||
<TS version="2.1">
|
|
||||||
<context>
|
|
||||||
<name>MainWindow</name>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="14"/>
|
|
||||||
<source>Wine 运行器虚拟机安装工具</source>
|
|
||||||
<oldsource>Windows 应用适配工具</oldsource>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="32"/>
|
|
||||||
<location filename="mainwindow.ui" line="35"/>
|
|
||||||
<source>设置</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="43"/>
|
|
||||||
<source>镜像路径:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="50"/>
|
|
||||||
<source>请选择系统镜像</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="57"/>
|
|
||||||
<source>浏览……</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="68"/>
|
|
||||||
<source>系统版本:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="89"/>
|
|
||||||
<source>其它 Windows 系统(不支持自动安装,传统启动,推荐 Windows 7 及以下)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="94"/>
|
|
||||||
<source>其他 Windows 系统(不支持自动安装,UEFI 启动,推荐 Windows 8 及以上)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="99"/>
|
|
||||||
<source>安装 WIndows 11(不支持自动安装)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="104"/>
|
|
||||||
<source>安装其他 Windows XP(支持自动安装,只支持 VirtualBox)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="109"/>
|
|
||||||
<source>安装其他 Windows (支持自动安装,传统启动,只支持 VirtualBox)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="114"/>
|
|
||||||
<source>安装其他 Windows(支持自动安装,UEFI 启动,只支持 VirtualBox)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="119"/>
|
|
||||||
<source>安装 arm32 系统(只支持 Qemu)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="124"/>
|
|
||||||
<source>安装 arm64 系统(只支持 Qemu)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="136"/>
|
|
||||||
<source>虚拟机(建议默认):</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="143"/>
|
|
||||||
<location filename="mainwindow.ui" line="153"/>
|
|
||||||
<source>qemu/kvm</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="158"/>
|
|
||||||
<source>VirtualBox</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="183"/>
|
|
||||||
<source>安装 Qemu</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="190"/>
|
|
||||||
<source>kvm 测试</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="197"/>
|
|
||||||
<source>Qemu虚拟机设置</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="204"/>
|
|
||||||
<source>添加/覆盖Qemu磁盘</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="211"/>
|
|
||||||
<source>导出Qemu磁盘</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="218"/>
|
|
||||||
<source>移除Qemu磁盘</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="225"/>
|
|
||||||
<source>获取VirtualBox</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="241"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">UOS 3a4000 用户在使用 Qemu 时可能会出现虚拟机无法正常开机的问题,需要安装/降级到以下链接的版本:</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">蓝奏云:</span><a href="https://gfdgdxi.lanzoue.com/b01rk9wza"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://gfdgdxi.lanzoue.com/b01rk9wza</span></a><span style=" font-size:11pt;"> 密码:6wvf</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58662214-c46520?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58662214-c46520?p=2061</span></a><span style=" font-size:11pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">注:Qemu 跨架构效率较低,如无特殊情况不建议跨架构/不开硬件加速(如 kvm)运行 Qemu</span></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">如何安装系统?使用迅雷或者网盘下载以下任意一个链接的 ISO 镜像然后在上面选择即可:</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">123 网盘链接:</span><a href="https://www.123pan.com/s/pDSKVv-oypWv"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://www.123pan.com/s/pDSKVv-oypWv</span></a></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">迅雷网盘:</span><a href="https://pan.xunlei.com/s/VNKMz3wgbYHg6JIh50ZKIc7pA1?pwd=35e5"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.xunlei.com/s/VNKMz3wgbYHg6JIh50ZKIc7pA1?pwd=35e5</span></a><span style=" font-size:10pt;"> 提取码:35e5</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">百度网盘:</span><a href="https://pan.baidu.com/s/19WbvinITCQJFZpAdZutrjg?pwd=me4y"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.baidu.com/s/19WbvinITCQJFZpAdZutrjg?pwd=me4y</span></a><span style=" font-size:10pt;"> 提取码: me4y</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58662220-3590cf?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58662220-3590cf?p=2061</span></a><span style=" font-size:10pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">(如果下载这个,系统版本选第一项,一般推荐这个)</span><a href="ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/</span></a></p>
|
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">(如果下载这个,系统版本选第二项)</span><a href="ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/</span></a></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt; font-weight:600;">常用 Windows 软件:</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">百度网盘:链接: </span><a href="https://pan.baidu.com/s/1D1NSy7k7XBnOZL_tNTnG6g?pwd=7s2p"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://pan.baidu.com/s/1D1NSy7k7XBnOZL_tNTnG6g?pwd=7s2p</span></a><span style=" font-size:11pt;"> 提取码: 7s2p </span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">诚通网盘:</span><a href="http://ctfile.gfdgdxi.top/d/31540479-58659214-0732a8?p=2061"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">http://ctfile.gfdgdxi.top/d/31540479-58659214-0732a8?p=2061</span></a><span style=" font-size:11pt;"> (访问密码: 2061)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">123网盘:</span><a href="https://www.123pan.com/s/pDSKVv-uCBWv.html"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://www.123pan.com/s/pDSKVv-uCBWv.html</span></a></p>
|
|
||||||
<hr /></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="283"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">给小白的一段话</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">其实本质上跑完安装程序就没有然后了,顶多如果想要运行舒服一点点,可以安装加强功能,直接拉到最底下看就可以了,<span style=" font-weight:600; font-style:italic; text-decoration: underline;">只限使用 VirtualBox</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic; text-decoration: underline;">如果你是用非 X86 PC,那暂时只能使用 qemu(没 kvm),且跨架构的性能损失很大,推荐使用 Windows XP 而非 Windows 7</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果爱折腾的话,下面的都看看也无所谓的,想看往下翻就可以了</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">(这里的帮助更新可能不会那么及时,更详细/新的帮助可以看:https://gitee.com/gfdgd-xi/deep-wine-runner/wikis 或 https://gitee.com/gfdgd-xi/wine-runner-wiki)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(如果鼠标被锁定到里面了按下键盘右边的“Ctrl”键就可以了,<span style=" font-weight:600; font-style:italic; text-decoration: underline;">qemu则是 Ctrl+Alt+G</span> )</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">VirtualBox 可以安装增强功能以优化体验,安装方法往下翻即可查询</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qemu 可以安装 Virtio 以优化体验,下载链接:<a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/</span></a></p>
|
|
||||||
<hr />
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:26pt; font-weight:600;"><br /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">安装是否需要人工进行操作?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果您下载的镜像本程序支持,则大部分不用,已经尽量省去了让新手头疼的虚拟机程序安装,创建、设置虚拟机,虚拟磁盘分区,寻找原版镜像文件等内容</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712191756.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">但有些设置依旧需要人工自行设置,例如安装界面密钥的输入、系统的激活(涉及版权问题,不会考虑省略)、增强功能的安装、需要使用的软件等等</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712192850.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712193527.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">什么样的镜像本程序(可能)不支持自动安装?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">非 Windows 7 镜像可能不支持自动安装(纯的 Windows 7 企业版镜像可能不支持自动安装),不保证系统能自动安装成功,例如 Windows XP、Windows 10、Deepin、Ubuntu 等等</p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">默认的虚拟机设置不习惯怎么改?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">1、打开启动器,打开 Oracle VM VirtualBox 程序</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">2、选择名字为“Windows”的虚拟机,然后在右边点击设置</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Manager_20220712223602.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">3、在这里修改即可</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox_20220712223705.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">安装加强功能有什么好处?(只限使用 VirtualBox)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1、支持鼠标自由从虚拟机和实体机切换</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2、支持虚拟机根据窗口大小自动设置分辨率</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3、支持文件共享、剪切板共享、文件拖放</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4、支持无缝模式</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_选择区域_20220712224639.png" /></p>
|
|
||||||
<hr />
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:26pt; font-weight:600;">如何安装加强功能?</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1、点击“设备”=》“加强功能”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图_VirtualBox Machine_20220712142929.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2、打开“计算机”,找到名为“VirtualBox Guest Additions”的光盘,双击进入,然后双击打开名为“VBoxWindowsAdditions”的程序</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143006.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3、在弹出的界面点击“是”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143018.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4、一直点“Next”</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143029.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143037.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">5、全部选择,然后点击“Install”进行安装</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143044.png" /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">6、等待安装完毕后,选择“Reboot now”然后点击“Finish”重启此虚拟机即可安装成功(选择“Reboot now”并点“Finish”会自动重新启动)</span></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/picture/截图/截图_VirtualBox Machine_20220712143103.png" /></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="421"/>
|
|
||||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10.5pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">此为 wine 运行器附属组件(虽然违背了“Wine Is Not An Emulator”&lt;Wine 不是一个模拟器&gt;的原意),旨在能更加完美、简单的运行 Windows 应用</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本程序基于 C++ Qt、Python 和 Virtualbox 制作,通过运行安装 Windows 操作系统的虚拟机实现在 Linux 运行 Windows exe 程序的功能。</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">基于 GPL V3 协议开源</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">项目地址:</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Gitee:<a href="https://gitee.com/gfdgd-xi/deep-wine-runner"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://gitee.com/gfdgd-xi/deep-wine-runner</span></a></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Github:<a href="https://github.com/gfdgd-xi/deep-wine-runner"><span style=" font-size:11pt; text-decoration: underline; color:#0082fa;">https://github.com/gfdgd-xi/deep-wine-runner</span></a></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">此组件也有非常大的缺点,就是相比于 Wine,会需要占用大量的空间、安装需要大量的时间、某些情况下需要相比于 Wine 需要消耗更多的系统资源,但可以更加完美、流畅的运行 Windows 应用,会尽量减少因为缺少或未实现导致的 Windows exe 程序运行异常</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">该组件制作者:gfdgd xi</p>
|
|
||||||
<hr />
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="463"/>
|
|
||||||
<source>虚拟机</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="487"/>
|
|
||||||
<source>导入/覆盖</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="492"/>
|
|
||||||
<source>导出</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="497"/>
|
|
||||||
<location filename="mainwindow.cpp" line="442"/>
|
|
||||||
<source>虚拟机安装日志</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="502"/>
|
|
||||||
<location filename="mainwindow.cpp" line="408"/>
|
|
||||||
<source>虚拟机运行日志</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="507"/>
|
|
||||||
<source>虚拟机测试(X86、Qemu)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="512"/>
|
|
||||||
<source>强制停止 VirtualBox</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="517"/>
|
|
||||||
<source>强制停止 Qemu</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="75"/>
|
|
||||||
<location filename="mainwindow.ui" line="79"/>
|
|
||||||
<source>Windows 7 32 位(支持自动安装)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="84"/>
|
|
||||||
<source>Windows 7 64 位(支持自动安装)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="232"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="274"/>
|
|
||||||
<source>安装/使用帮助</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="364"/>
|
|
||||||
<location filename="mainwindow.ui" line="482"/>
|
|
||||||
<source>关于</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.ui" line="477"/>
|
|
||||||
<source>退出</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="88"/>
|
|
||||||
<source>Wine 运行器虚拟机安装工具 </source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source><p>程序版本号:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source></p><p>安装包构建时间:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="90"/>
|
|
||||||
<source></p><p>该组件构建时间:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="92"/>
|
|
||||||
<source><hr/><h1>谢明列表</h1></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="179"/>
|
|
||||||
<location filename="mainwindow.cpp" line="186"/>
|
|
||||||
<location filename="mainwindow.cpp" line="193"/>
|
|
||||||
<location filename="mainwindow.cpp" line="200"/>
|
|
||||||
<location filename="mainwindow.cpp" line="215"/>
|
|
||||||
<location filename="mainwindow.cpp" line="222"/>
|
|
||||||
<location filename="mainwindow.cpp" line="229"/>
|
|
||||||
<location filename="mainwindow.cpp" line="248"/>
|
|
||||||
<location filename="mainwindow.cpp" line="254"/>
|
|
||||||
<location filename="mainwindow.cpp" line="263"/>
|
|
||||||
<location filename="mainwindow.cpp" line="307"/>
|
|
||||||
<location filename="mainwindow.cpp" line="322"/>
|
|
||||||
<location filename="mainwindow.cpp" line="328"/>
|
|
||||||
<location filename="mainwindow.cpp" line="332"/>
|
|
||||||
<location filename="mainwindow.cpp" line="338"/>
|
|
||||||
<location filename="mainwindow.cpp" line="357"/>
|
|
||||||
<location filename="mainwindow.cpp" line="360"/>
|
|
||||||
<location filename="mainwindow.cpp" line="364"/>
|
|
||||||
<location filename="mainwindow.cpp" line="367"/>
|
|
||||||
<location filename="mainwindow.cpp" line="392"/>
|
|
||||||
<location filename="mainwindow.cpp" line="404"/>
|
|
||||||
<location filename="mainwindow.cpp" line="438"/>
|
|
||||||
<source>提示</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="179"/>
|
|
||||||
<source>您似乎没有安装 Qemu,是否继续创建虚拟机?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="186"/>
|
|
||||||
<source>您似乎没有安装 VBox,是否继续创建虚拟机?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="193"/>
|
|
||||||
<source>无法检测到 qemu-system-arm,是否继续创建虚拟机?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="200"/>
|
|
||||||
<source>无法检测到 qemu-system-aarch64,是否继续创建虚拟机?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="215"/>
|
|
||||||
<source>似乎无法找到 Windows7X86Auto.iso,是否继续创建虚拟机?
|
|
||||||
缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="222"/>
|
|
||||||
<source>似乎无法找到 Windows7X64Auto.iso,是否继续创建虚拟机?
|
|
||||||
缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="229"/>
|
|
||||||
<source>似乎无法找到 UEFI 固件,是否继续创建虚拟机?
|
|
||||||
Qemu 固件可以在“安装 Qemu”处安装</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="248"/>
|
|
||||||
<source>Qemu 不支持该选项!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="254"/>
|
|
||||||
<location filename="mainwindow.cpp" line="263"/>
|
|
||||||
<source>VirtualBox 不支持该选项!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="278"/>
|
|
||||||
<source>提示:目前已经尝试开启虚拟机,如果在一段时间后依旧还没看到虚拟机窗口开启,请在菜单栏查看虚拟机日志</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="307"/>
|
|
||||||
<source>磁盘文件已存在,是否覆盖?
|
|
||||||
覆盖后将无法恢复!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="311"/>
|
|
||||||
<source>选择 Qemu 镜像</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="311"/>
|
|
||||||
<source>Qemu镜像(*.qcow2 *.img *.raw *.qcow *.qed *.vdi *.vhdx *.vmdk);;所有文件(*.*)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="322"/>
|
|
||||||
<location filename="mainwindow.cpp" line="328"/>
|
|
||||||
<source>添加错误!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="332"/>
|
|
||||||
<source>添加完成!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="338"/>
|
|
||||||
<source>不存在磁盘文件,无法导出</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="357"/>
|
|
||||||
<source>不存在磁盘文件,无法移除</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="360"/>
|
|
||||||
<source>是否删除?
|
|
||||||
删除后将无法恢复!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="364"/>
|
|
||||||
<source>移除失败</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="367"/>
|
|
||||||
<source>移除成功</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="373"/>
|
|
||||||
<location filename="mainwindow.cpp" line="389"/>
|
|
||||||
<source>错误</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="373"/>
|
|
||||||
<source>未识别到命令 kvm-ok
|
|
||||||
可以使用命令 sudo apt install cpu-checker 安装</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="383"/>
|
|
||||||
<source>使用</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="389"/>
|
|
||||||
<source>您的系统不支持使用 kvm:
|
|
||||||
</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="392"/>
|
|
||||||
<source>您的系统支持使用 kvm:
|
|
||||||
</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="404"/>
|
|
||||||
<location filename="mainwindow.cpp" line="438"/>
|
|
||||||
<source>没有日志文件</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="408"/>
|
|
||||||
<source>运行日志</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="mainwindow.cpp" line="442"/>
|
|
||||||
<source>安装日志</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>QemuSetting</name>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="14"/>
|
|
||||||
<source>设置</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="35"/>
|
|
||||||
<source><h3>远程服务</h3></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="42"/>
|
|
||||||
<source>VNC服务端口:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="49"/>
|
|
||||||
<source>开启 rdp 服务映射</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="56"/>
|
|
||||||
<source>内存大小(MB):</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="90"/>
|
|
||||||
<source><h3>基础设置</h3></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="97"/>
|
|
||||||
<source>开启VNC服务</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="104"/>
|
|
||||||
<source>开启 kvm 加速</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="111"/>
|
|
||||||
<source>CPU核心数:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="125"/>
|
|
||||||
<source>开启声音</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="145"/>
|
|
||||||
<source>保存</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="158"/>
|
|
||||||
<source>取消</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="171"/>
|
|
||||||
<source>重置
|
|
||||||
默认</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="qemusetting.ui" line="185"/>
|
|
||||||
<source>获取
|
|
||||||
Wine
|
|
||||||
运行器</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
import PyQt5.QtWidgets as QtWidgets
|
|
||||||
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
|
||||||
arch = subprocess.getoutput("dpkg --print-architecture").replace(" ", "").replace("\n", "")
|
|
||||||
if os.path.exists(f"{programPath}/VirtualMachine-{arch}"):
|
|
||||||
os.system(f"{programPath}/VirtualMachine-{arch}")
|
|
||||||
exit()
|
|
||||||
# 判断文件是否解压
|
|
||||||
if not os.path.exists(f"{programPath}/VirtualMachine-amd64"):
|
|
||||||
# 解压文件
|
|
||||||
os.system(f"cd '{programPath}' ; tar -xvf vm.tar.gz")
|
|
||||||
if os.path.exists(f"{programPath}/VirtualMachine-{arch}"):
|
|
||||||
os.system(f"{programPath}/VirtualMachine-{arch}")
|
|
||||||
exit()
|
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
|
||||||
QtWidgets.QMessageBox.information(None, "提示", "虚拟机安装器暂不支持此系统")
|
|
||||||
exit(1)
|
|
||||||
# 后面已废弃
|
|
||||||
# 只能使用 Qemu User 运行程序
|
|
||||||
if os.path.exists("/usr/lib/x86_64-linux-gnu/") and not os.system("which qemu-x86_64"):
|
|
||||||
os.system(f"qemu-x86_64 '{programPath}/VirtualMachine-x86_64'")
|
|
||||||
exit()
|
|
||||||
print("未安装环境,立即安装!")
|
|
||||||
os.system(f"python3 '{programPath}/../RunCommandWithTerminal.py' '{programPath}/../InstallRuntime/amd64.sh'")
|
|
||||||
1
VM/VirtualMachine
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
mainwindow.py
|
||||||
0
VM-source/application-vnd.oasis.opendocument.text.svg → VM/application-vnd.oasis.opendocument.text.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
241
VM/buildvbox.py
Executable file
@@ -0,0 +1,241 @@
|
|||||||
|
# *
|
||||||
|
# * gfdgd xi
|
||||||
|
# * 依照 GPLV3 开源
|
||||||
|
# *
|
||||||
|
|
||||||
|
import os
|
||||||
|
import psutil
|
||||||
|
import subprocess
|
||||||
|
from vbox import *
|
||||||
|
from qemu import *
|
||||||
|
from infoUtils import *
|
||||||
|
from PyQt5.QtNetwork import *
|
||||||
|
|
||||||
|
class buildvbox:
|
||||||
|
def homePath(self):
|
||||||
|
return os.getenv("HOME")
|
||||||
|
|
||||||
|
def applicationDirPath(self):
|
||||||
|
return os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
||||||
|
|
||||||
|
# 清屏
|
||||||
|
def CleanScreen(self):
|
||||||
|
if(os.system("/etc/os-version")):
|
||||||
|
# Unix
|
||||||
|
os.system("clear")
|
||||||
|
return
|
||||||
|
# Windows
|
||||||
|
os.system("cls")
|
||||||
|
|
||||||
|
# 获取 CPU 个数
|
||||||
|
def GetCPUSocket(self) -> int:
|
||||||
|
# 获取命令返回值
|
||||||
|
value = int(subprocess.getoutput("bash -c 'cat /proc/cpuinfo | grep \"cpu cores\" | uniq | wc -l'"))
|
||||||
|
# 判断异常值,例如没挂载 /proc
|
||||||
|
if (value <= 0):
|
||||||
|
value = 1
|
||||||
|
return value
|
||||||
|
|
||||||
|
# 获取 CPU 核心数
|
||||||
|
def GetCPUCore(self) -> int:
|
||||||
|
value = int(subprocess.getoutput("bash -c \"grep 'core id' /proc/cpuinfo | sort -u | wc -l\""))
|
||||||
|
# 判断异常值,例如没挂载 /proc
|
||||||
|
if(value <= 0):
|
||||||
|
value = 1
|
||||||
|
return value
|
||||||
|
|
||||||
|
def GetNet(self) -> str:
|
||||||
|
netList = QNetworkInterface.allInterfaces()
|
||||||
|
for net in netList:
|
||||||
|
print("Device:", net.name())
|
||||||
|
entryList = net.addressEntries()
|
||||||
|
for entry in entryList:
|
||||||
|
ip = entry.ip().toString()
|
||||||
|
print("IP Address: ", ip)
|
||||||
|
if(ip != "127.0.0.1" and ip != "192.168.250.1" and ip != "::1" and net.name() != "lo"):
|
||||||
|
# 返回网卡名称
|
||||||
|
return net.name()
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def Download(self, url: str, path: str, fileName: str) -> int:
|
||||||
|
return os.system(("aria2c -x 16 -s 16 -c " + url + " -d " + path + " -o " + fileName))
|
||||||
|
|
||||||
|
def __init__(self, isoPath: str, id = 0, vm = 0):
|
||||||
|
programPath = self.applicationDirPath()
|
||||||
|
|
||||||
|
net = self.GetNet()
|
||||||
|
print("使用网卡:", net)
|
||||||
|
if(vm == 0):
|
||||||
|
# Qemu
|
||||||
|
vm = qemu("Windows")
|
||||||
|
setISOAlready = 0
|
||||||
|
if (id == 0):
|
||||||
|
vm.Create("Windows7")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 1):
|
||||||
|
vm.Create("Windows7_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 2):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 3):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
elif (id == 4):
|
||||||
|
vm.Create("Windows11_64")
|
||||||
|
vm.SetDisplayMemory(128)
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 5):
|
||||||
|
vm.Create("WindowsXP_32")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 6):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 7):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 8):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
vm.UseArmhfEFI()
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 9):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
vm.UseAarch64EFI()
|
||||||
|
setISOAlready = 1
|
||||||
|
vm.CreateDiskControl()
|
||||||
|
#vm.CreateDiskControl("storage_controller_2")
|
||||||
|
if(id == 0 or id == 1):
|
||||||
|
vm.CreateDisk(self.homePath() + "/Qemu/Windows/Windows.qcow2", 131072)
|
||||||
|
else:
|
||||||
|
vm.CreateDisk(self.homePath() + "/Qemu/Windows/Windows.qcow2", 131072 * 5)
|
||||||
|
|
||||||
|
#vm.MountDisk(self.homePath() + "/Qemu/Windows/Windows.qcow2")
|
||||||
|
vm.MountMainDisk(self.homePath() + "/Qemu/Windows/Windows.qcow2")
|
||||||
|
if(os.path.exists("/opt/apps/deepin-wine-runner-qemu-system-extra/files/resources/virtio-win.iso")):
|
||||||
|
vm.MountISO("/opt/apps/deepin-wine-runner-qemu-system-extra/files/resources/virtio-win.iso", "storage_controller_2", 1, 3)
|
||||||
|
if(not setISOAlready):
|
||||||
|
vm.MountISO(isoPath, "storage_controller_1", 0, 1)
|
||||||
|
if (id == 0):
|
||||||
|
if(os.system(programPath + "/Windows7X86Auto.iso")):
|
||||||
|
vm.MountISO(programPath + "/Windows7X86Auto.iso", "storage_controller_1", 1, 2)
|
||||||
|
elif (id == 1):
|
||||||
|
if(os.system(programPath + "/Windows7X64Auto.iso")):
|
||||||
|
vm.MountISO(programPath + "/Windows7X64Auto.iso", "storage_controller_1", 1, 2)
|
||||||
|
else:
|
||||||
|
#vm.AutoInstall(isoPath)
|
||||||
|
if(isoPath != ""):
|
||||||
|
vm.MountMainISO(isoPath)
|
||||||
|
vm.SetCPU(psutil.cpu_count(), self.GetCPUSocket(), self.GetCPUCore())
|
||||||
|
memory = 0
|
||||||
|
memoryAll = 0
|
||||||
|
swap = 0
|
||||||
|
swapAll = 0
|
||||||
|
# TODO
|
||||||
|
memory, memoryAll, swap, swapAll = infoUtils().memoryRate()
|
||||||
|
vm.SetMemory(int(memoryAll / 3 / 1024))
|
||||||
|
vm.SetNetBridge(net)
|
||||||
|
vm.EnabledAudio()
|
||||||
|
vm.EnabledClipboardMode()
|
||||||
|
vm.EnabledDraganddrop()
|
||||||
|
vm.SetVBoxSVGA()
|
||||||
|
vm.SetMousePS2()
|
||||||
|
vm.SetKeyboardPS2()
|
||||||
|
vm.OpenUSB()
|
||||||
|
vm.ShareFile("ROOT", "/")
|
||||||
|
vm.ShareFile("HOME", self.homePath())
|
||||||
|
# TODO
|
||||||
|
if (id == 8):
|
||||||
|
vm.StartArmhf()
|
||||||
|
elif (id == 9):
|
||||||
|
vm.StartAarch64()
|
||||||
|
else:
|
||||||
|
vm.Start()
|
||||||
|
elif(vm == 1):
|
||||||
|
# VirtualBox
|
||||||
|
vm = vbox("Windows")
|
||||||
|
setISOAlready = 1
|
||||||
|
if (id == 0):
|
||||||
|
vm.Create("Windows7")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 1):
|
||||||
|
vm.Create("Windows7_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 2):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 3):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
elif (id == 4):
|
||||||
|
vm.Create("Windows11_64")
|
||||||
|
vm.SetDisplayMemory(128)
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 5):
|
||||||
|
vm.Create("WindowsXP_32")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 6):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
setISOAlready = 1
|
||||||
|
elif (id == 7):
|
||||||
|
vm.Create("WindowsNT_64")
|
||||||
|
vm.SetDisplayMemory(32)
|
||||||
|
vm.EnabledUEFI(True)
|
||||||
|
setISOAlready = 1
|
||||||
|
if (not os.path.exists):
|
||||||
|
os.makedirs("/home/gfdgd_xi/Qemu/Windows/")
|
||||||
|
vm.CreateDiskControl()
|
||||||
|
#vm.CreateDiskControl("storage_controller_2")
|
||||||
|
if(id == 0 or id == 1):
|
||||||
|
vm.CreateDisk(self.homePath() + "/VirtualBox VMs/Windows/Windows.vdi", 131072)
|
||||||
|
else:
|
||||||
|
vm.CreateDisk(self.homePath() + "/VirtualBox VMs/Windows/Windows.vdi", 131072 * 5)
|
||||||
|
vm.MountDisk(self.homePath() + "/VirtualBox VMs/Windows/Windows.vdi")
|
||||||
|
if(not setISOAlready):
|
||||||
|
vm.MountISO(isoPath, "storage_controller_1", 0, 1)
|
||||||
|
if (id == 0):
|
||||||
|
if(os.system(programPath + "/Windows7X86Auto.iso")):
|
||||||
|
vm.MountISO(programPath + "/Windows7X86Auto.iso", "storage_controller_1", 1, 0)
|
||||||
|
elif (id == 1):
|
||||||
|
if(os.system(programPath + "/Windows7X64Auto.iso")):
|
||||||
|
vm.MountISO(programPath + "/Windows7X64Auto.iso", "storage_controller_1", 1, 0)
|
||||||
|
else:
|
||||||
|
vm.AutoInstall(isoPath)
|
||||||
|
# 判断 VirtualBox Guest ISO 是否存在
|
||||||
|
# 在的话直接挂载
|
||||||
|
if(os.system("/usr/share/virtualbox/VBoxGuestAdditions.iso")):
|
||||||
|
vm.MountISO("/usr/share/virtualbox/VBoxGuestAdditions.iso", "storage_controller_1", 1, 1)
|
||||||
|
# VirtualBox 的 CPU 数量设置方法和 Qemu 不一样
|
||||||
|
vm.SetCPU(self.GetCPUCore(), self.GetCPUSocket(), self.GetCPUCore())
|
||||||
|
memory = 0
|
||||||
|
memoryAll = 0
|
||||||
|
swap = 0
|
||||||
|
swapAll = 0
|
||||||
|
# TODO
|
||||||
|
memory, memoryAll, swap, swapAll = infoUtils().memoryRate()
|
||||||
|
#memoryRate(memory, memoryAll, swap, swapAll)
|
||||||
|
vm.SetMemory(int(memoryAll / 3 / 1024))
|
||||||
|
print(memoryAll)
|
||||||
|
vm.SetNetBridge(net)
|
||||||
|
vm.EnabledAudio()
|
||||||
|
vm.EnabledClipboardMode()
|
||||||
|
vm.EnabledDraganddrop()
|
||||||
|
vm.SetVBoxSVGA()
|
||||||
|
vm.SetMousePS2()
|
||||||
|
vm.SetKeyboardPS2()
|
||||||
|
vm.OpenUSB()
|
||||||
|
vm.ShareFile("ROOT", "/")
|
||||||
|
vm.ShareFile("HOME", self.homePath())
|
||||||
|
vm.Start()
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
184
VM/infoUtils.py
Executable file
@@ -0,0 +1,184 @@
|
|||||||
|
PROC_UPTIME = "/proc/uptime"
|
||||||
|
PROC_CPU = "/proc/stat"
|
||||||
|
PROC_MEM = "/proc/meminfo"
|
||||||
|
PROC_NET = "/proc/net/dev"
|
||||||
|
|
||||||
|
import enum
|
||||||
|
import psutil
|
||||||
|
from PyQt5.QtCore import *
|
||||||
|
|
||||||
|
class infoUtils:
|
||||||
|
class RateUnit(enum.Enum):
|
||||||
|
RateBit = 0,
|
||||||
|
RateByte = 1,
|
||||||
|
RateKb = 2,
|
||||||
|
RateMb = 3,
|
||||||
|
RateGb = 4,
|
||||||
|
RateTb = 5,
|
||||||
|
RateUnknow = 6
|
||||||
|
|
||||||
|
class Sensitive(enum.Enum):
|
||||||
|
Default = 0, # 大小写混合
|
||||||
|
Upper = 1, # 全部大写
|
||||||
|
Lower = 2 # 全部小写
|
||||||
|
|
||||||
|
def setRateUnitSensitive(self, unit: RateUnit, sensitive: Sensitive):
|
||||||
|
if (sensitive == self.Sensitive.Default):
|
||||||
|
if (unit == self.RateUnit.RateBit):
|
||||||
|
return str("b/s")
|
||||||
|
elif (unit == self.RateUnit.RateByte):
|
||||||
|
return str("B/s")
|
||||||
|
elif (unit == self.RateUnit.RateKb):
|
||||||
|
return str("Kb/s")
|
||||||
|
elif (unit == self.RateUnit.RateMb):
|
||||||
|
return str("Mb/s")
|
||||||
|
elif (unit == self.RateUnit.RateGb):
|
||||||
|
return str("Gb/s")
|
||||||
|
elif (unit == self.RateUnit.RateTb):
|
||||||
|
return str("Tb/s")
|
||||||
|
else:
|
||||||
|
# print("Sensitive::Default, RateUnit is RateUnknow.")
|
||||||
|
return str("")
|
||||||
|
elif (sensitive == self.Sensitive.Upper):
|
||||||
|
if (unit == self.RateUnit.RateBit):
|
||||||
|
return str("BIT/S")
|
||||||
|
elif (unit == self.RateUnit.RateByte):
|
||||||
|
return str("B/S")
|
||||||
|
elif (unit == self.RateUnit.RateKb):
|
||||||
|
return str("KB/S")
|
||||||
|
elif (unit == self.RateUnit.RateMb):
|
||||||
|
return str("MB/S")
|
||||||
|
elif (unit == self.RateUnit.RateGb):
|
||||||
|
return str("GB/S")
|
||||||
|
elif (unit == self.RateUnit.RateTb):
|
||||||
|
return str("TB/S")
|
||||||
|
else:
|
||||||
|
#print("Sensitive::Upper, RateUnit is RateUnknow.")
|
||||||
|
return str("")
|
||||||
|
elif (sensitive == self.Sensitive.Lower):
|
||||||
|
if (unit == self.RateUnit.RateBit):
|
||||||
|
return str("bit/s")
|
||||||
|
elif (unit == self.RateUnit.RateByte):
|
||||||
|
return str("b/s")
|
||||||
|
elif (unit == self.RateUnit.RateKb):
|
||||||
|
return str("kb/s")
|
||||||
|
elif (unit == self.RateUnit.RateMb):
|
||||||
|
return str("mb/s")
|
||||||
|
elif (unit == self.RateUnit.RateGb):
|
||||||
|
return str("gb/s")
|
||||||
|
elif (unit == self.RateUnit.RateTb):
|
||||||
|
return str("tb/s")
|
||||||
|
else:
|
||||||
|
#qDebug()<<str("Sensitive::Lower, RateUnit is RateUnknow.")
|
||||||
|
return str("")
|
||||||
|
else:
|
||||||
|
# qDebug()<<str("Sensitive is RateUnknow.")
|
||||||
|
return str("")
|
||||||
|
|
||||||
|
# TODO unit 在原来是指针,这里还没做处理
|
||||||
|
def autoRateUnits(self, speed: int, unit: RateUnit) -> float:
|
||||||
|
# 自动判断合适的速率单位,默认传进来的是 Byte
|
||||||
|
# * bit 0 ~ 7 位 (不到 1 字节)
|
||||||
|
# * Byte 1 ~ 2^10 Byte
|
||||||
|
# * KB 2^10 ~ 2^20 Byte
|
||||||
|
# * MB 2^20 ~ 2^30 Byte
|
||||||
|
# * GB 2^30 ~ 2^40 Byte
|
||||||
|
# * TB 2^40 ~ 2^50 Byte
|
||||||
|
if (unit != self.RateUnit.RateByte):
|
||||||
|
#print("请先将单位转为字节(byte)后再传参")
|
||||||
|
return -1
|
||||||
|
sp = 0
|
||||||
|
if (0 <= speed and speed < pow(2, 10)):
|
||||||
|
unit = self.RateUnit.RateByte
|
||||||
|
sp = speed
|
||||||
|
elif (pow(2, 10) <= speed and speed < pow(2, 20)):
|
||||||
|
unit = self.RateUnit.RateKb
|
||||||
|
sp = float(speed / pow(2, 10) * 1.0)
|
||||||
|
elif (pow(2, 20) <= speed and speed < pow(2, 30)):
|
||||||
|
unit = self.RateUnit.RateMb
|
||||||
|
sp = float(speed / pow(2, 20) * 1.0)
|
||||||
|
elif (pow(2, 30) <= speed and speed < pow(2, 40)):
|
||||||
|
unit = self.RateUnit.RateGb
|
||||||
|
sp = float(speed / pow(2, 30) * 1.0)
|
||||||
|
elif (pow(2, 40) <= speed and speed < pow(2, 50)):
|
||||||
|
unit = self.RateUnit.RateTb
|
||||||
|
sp = float(speed / pow(2, 40) * 1.0)
|
||||||
|
else:
|
||||||
|
unit = self.RateUnit.RateUnknow
|
||||||
|
# qDebug()<<"本设备网络速率单位传输超过 TB, 或者低于 0 Byte."
|
||||||
|
sp = -1
|
||||||
|
return sp
|
||||||
|
|
||||||
|
# TODO run,idle 在原来是指针,这里还没做处理
|
||||||
|
def uptime(self):
|
||||||
|
file = QFile(PROC_UPTIME) # /proc/uptime
|
||||||
|
if(not file.open(QIODevice.ReadOnly or QIODevice.Text)):
|
||||||
|
return
|
||||||
|
stream = QTextStream(file)
|
||||||
|
line = stream.readLine()
|
||||||
|
list = line.split(QRegExp("\\s{1,}"))
|
||||||
|
if(list.count()):
|
||||||
|
run = float(list[0])
|
||||||
|
idle = float(list[1])
|
||||||
|
file.close()
|
||||||
|
return run, idle
|
||||||
|
|
||||||
|
# TODO netDown, netUpload 在原来是指针,这里还没做处理
|
||||||
|
def netRate(self, netDown, netUpload):
|
||||||
|
file = QFile(PROC_NET) # /proc/net/dev
|
||||||
|
if (not file.open(QIODevice.ReadOnly or QIODevice.Text)): # 在读取时,把行尾结束符修改为 '\n'; 在写入时,把行尾结束符修改为本地系统换行风格,比如Windows文本换行是 "\r\n"
|
||||||
|
return
|
||||||
|
down = 0
|
||||||
|
upload = 0
|
||||||
|
stream = QTextStream(file)
|
||||||
|
line = stream.readLine()
|
||||||
|
line = stream.readLine()
|
||||||
|
line = stream.readLine()
|
||||||
|
while (not line.isNull()):
|
||||||
|
line = line.trimmed()
|
||||||
|
list = line.split(QRegExp("\\s{1,}")) # 匹配任意 大于等于1个的 空白字符
|
||||||
|
if (list.count()):
|
||||||
|
down = int(list[1])
|
||||||
|
upload = int(list[9])
|
||||||
|
netDown += down
|
||||||
|
netUpload += upload
|
||||||
|
line = stream.readLine()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
'''def cpuRate(self, cpuAll, cpuFree):
|
||||||
|
cpuAll = cpuFree = 0
|
||||||
|
ok = False
|
||||||
|
file = QFile(PROC_CPU) # /proc/stat
|
||||||
|
if(not file.open(QIODevice.ReadOnly or QIODevice.Text)):
|
||||||
|
return
|
||||||
|
stream = QTextStream(file)
|
||||||
|
line = stream.readLine()
|
||||||
|
if (line != None):
|
||||||
|
list = line.split(QRegExp("\\s{1,}"))
|
||||||
|
for (auto v = list.begin() + 1 v != list.end() ++v)
|
||||||
|
cpuAll += (*v).toLong(&ok)
|
||||||
|
cpuFree = list.at(4).toLong(&ok)
|
||||||
|
file.close()'''
|
||||||
|
|
||||||
|
def memoryRate(self):
|
||||||
|
memory = memoryAll = 0
|
||||||
|
swap = swapAll = None
|
||||||
|
'''ok = False
|
||||||
|
file = QFile(PROC_MEM) # /proc/meminfo
|
||||||
|
if (not file.open(QIODevice.ReadOnly or QIODevice.Text)):
|
||||||
|
return
|
||||||
|
stream = QTextStream(file)
|
||||||
|
buff = [0]
|
||||||
|
for i in range(16):
|
||||||
|
line = stream.readLine()
|
||||||
|
list = line.split(QRegExp("\\s{1,}"))
|
||||||
|
buff[i] = int(list[1])
|
||||||
|
memoryAll = buff[0]
|
||||||
|
memory = buff[0] - buff[2]
|
||||||
|
swapAll = buff[14]
|
||||||
|
swap = buff[14] - buff[15]
|
||||||
|
file.close()'''
|
||||||
|
mem = psutil.virtual_memory()
|
||||||
|
memoryAll = int(mem.total / 1024)
|
||||||
|
memory = int(mem.used/ 1024)
|
||||||
|
return memory, memoryAll, swap, swapAll
|
||||||
333
VM/mainwindow.py
Executable file
@@ -0,0 +1,333 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
||||||
|
sys.path.append(f"{programPath}/../")
|
||||||
|
sys.path.append(f"{programPath}/")
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
import program_resources
|
||||||
|
import ui_mainwindow
|
||||||
|
import globalenv
|
||||||
|
from buildvbox import *
|
||||||
|
from PyQt5.QtGui import *
|
||||||
|
from PyQt5.QtCore import *
|
||||||
|
from PyQt5.QtWidgets import *
|
||||||
|
|
||||||
|
stopShowTime = False
|
||||||
|
m_cpuAll = 0
|
||||||
|
m_cpuFree = 0
|
||||||
|
|
||||||
|
def ShowCPUMessage():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def MainWindow():
|
||||||
|
global cpuGet
|
||||||
|
if (__name__ == "__main__"):
|
||||||
|
ui.tabWidget.setTabPosition(QTabWidget.West) # 标签靠左
|
||||||
|
else:
|
||||||
|
ui.tabWidget.setTabPosition(QTabWidget.East) # 标签靠左
|
||||||
|
#QApplication a(argc, argv)
|
||||||
|
# 选择最优虚拟机
|
||||||
|
if(not os.system("which qemu-system-x86_64")):
|
||||||
|
ui.vmChooser.setCurrentIndex(0)
|
||||||
|
if(not os.system("which vboxmanage")):
|
||||||
|
ui.vmChooser.setCurrentIndex(1)
|
||||||
|
if(not os.path.exists(programPath + "/../RunCommandWithTerminal.py")):
|
||||||
|
ui.getQemu.setDisabled(True)
|
||||||
|
# 允许输出 qDebug 信息
|
||||||
|
#QLoggingCategory.defaultCategory().setEnabled(QLoggingCategory.QtDebugMsg, True)
|
||||||
|
# 判断是否安装 vbox(无需判断)
|
||||||
|
'''if(os.system("which VBoxManage")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), "检测到您似乎没有安装 VirtualBox,立即安装?") == QMessageBox.Yes):
|
||||||
|
os.system("xdg-open https:#www.virtualbox.org/wiki/Linux_Downloads")
|
||||||
|
}
|
||||||
|
}'''
|
||||||
|
# QTimer
|
||||||
|
cpuGet = QTimer(window)
|
||||||
|
cpuGet.timeout.connect(ShowCPUMessage)
|
||||||
|
cpuGet.setInterval(1000)
|
||||||
|
cpuGet.start()
|
||||||
|
ShowCPUMessage()
|
||||||
|
# 读取程序版本号
|
||||||
|
# / 版本号文件是否存在
|
||||||
|
if (not os.path.exists(programPath + "/../information.json")):
|
||||||
|
QMessageBox.critical(window, "错误", "无法读取版本号!")
|
||||||
|
return
|
||||||
|
with open(programPath + "/../information.json", "r") as file:
|
||||||
|
fileinfo = file.read()
|
||||||
|
versionObject = json.loads(fileinfo)
|
||||||
|
buildTime = versionObject["Time"]
|
||||||
|
versionValue = versionObject["Version"]
|
||||||
|
thank = versionObject["Thank"]
|
||||||
|
thankText = ""
|
||||||
|
for i in range(0, len(thank)):
|
||||||
|
thankText += "<p>" + thank[i] + "</p>\n"
|
||||||
|
print(thank[i])
|
||||||
|
# 设置程序标题
|
||||||
|
this.setWindowTitle(("Wine 运行器虚拟机安装工具 ") + versionValue)
|
||||||
|
# 读取谢明列表
|
||||||
|
ui.textBrowser_2.setHtml(("<p>程序版本号:") + versionValue + ", " + subprocess.getoutput("arch") + ("</p><p>安装包构建时间:") + buildTime + "</p>" + ui.textBrowser_2.toHtml() +
|
||||||
|
("<hr/><h1>谢明列表</h1>") + thankText)
|
||||||
|
ui.textBrowser_2.anchorClicked.connect(lambda link: QDesktopServices.openUrl(link))
|
||||||
|
ui.textBrowser.anchorClicked.connect(lambda link: QDesktopServices.openUrl(link))
|
||||||
|
ui.textBrowser_3.anchorClicked.connect(lambda link: QDesktopServices.openUrl(link))
|
||||||
|
# 设置标签栏图标
|
||||||
|
ui.tabWidget.setTabIcon(1, QIcon.fromTheme(f"{programPath}/application-vnd.oasis.opendocument.text.svg"))
|
||||||
|
# 设置窗口图标
|
||||||
|
this.setWindowIcon(QIcon(f"{programPath}/deepin-wine-runner.svg"))
|
||||||
|
|
||||||
|
def GetRunCommand(command: str):
|
||||||
|
return subprocess.getoutput(command)
|
||||||
|
|
||||||
|
def on_browser_clicked():
|
||||||
|
# 浏览镜像文件
|
||||||
|
filePath = QFileDialog.getOpenFileName(this, "选择 ISO 文件", QDir.homePath(), "ISO 镜像文件(*.iso)所有文件(*.*)")[0]
|
||||||
|
if(filePath != ""):
|
||||||
|
ui.isoPath.setText(filePath)
|
||||||
|
|
||||||
|
def on_install_clicked():
|
||||||
|
global stopShowTime
|
||||||
|
if (ui.vmChooser.currentIndex() == 0):
|
||||||
|
if(os.system("which qemu-system-x86_64")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("您似乎没有安装 Qemu,是否继续创建虚拟机?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
elif (ui.vmChooser.currentIndex() == 1):
|
||||||
|
if(os.system("which vboxmanage")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("您似乎没有安装 VBox,是否继续创建虚拟机?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
elif (ui.vmChooser.currentIndex() == 8):
|
||||||
|
if(os.system("which qemu-system-arm")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("无法检测到 qemu-system-arm,是否继续创建虚拟机?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
elif (ui.vmChooser.currentIndex() == 9):
|
||||||
|
if(os.system("which qemu-system-aarch64")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("无法检测到 qemu-system-aarch64,是否继续创建虚拟机?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
file = QFile(QDir.homePath() + "/.config/deepin-wine-runner/QEMU-EFI")
|
||||||
|
archFile = QFile(QDir.homePath() + "/.config/deepin-wine-runner/QEMU-ARCH")
|
||||||
|
dir = QDir(QDir.homePath() + "/.config/deepin-wine-runner")
|
||||||
|
archFile.open(QIODevice.WriteOnly)
|
||||||
|
archFile.write("amd64".encode("utf-8"))
|
||||||
|
archFile.close()
|
||||||
|
if (ui.systemVersion.currentIndex() == 0):
|
||||||
|
if(not QFile.exists(programPath + "/Windows7X86Auto.iso")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("似乎无法找到 Windows7X86Auto.iso,是否继续创建虚拟机?\n缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
elif (ui.systemVersion.currentIndex() == 1):
|
||||||
|
if(not QFile.exists(programPath + "/Windows7X64Auto.iso")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("似乎无法找到 Windows7X64Auto.iso,是否继续创建虚拟机?\n缺少该文件可能会导致虚拟机无法正常启动,尝试重新安装 Wine 运行器再试试?")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
elif (ui.systemVersion.currentIndex() == 3):
|
||||||
|
if(not QFile.exists("/usr/share/qemu/OVMF.fd") and not QFile.exists(programPath + "/OVMF.fd") and ui.vmChooser.currentIndex() == 0):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("似乎无法找到 UEFI 固件,是否继续创建虚拟机?\nQemu 固件可以在“安装 Qemu”处安装")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
if(not dir.exists()):
|
||||||
|
dir.mkpath(QDir.homePath() + "/.config/deepin-wine-runner")
|
||||||
|
if(not QFile.exists(QDir.homePath() + "/.config/deepin-wine-runner/QEMU-EFI")):
|
||||||
|
# 写入用于识别的空文件
|
||||||
|
file.open(QIODevice.WriteOnly)
|
||||||
|
file.write("1")
|
||||||
|
file.close()
|
||||||
|
elif (ui.systemVersion.currentIndex() == 4 or
|
||||||
|
ui.systemVersion.currentIndex() == 5 or
|
||||||
|
ui.systemVersion.currentIndex() == 6 or
|
||||||
|
ui.systemVersion.currentIndex() == 7):
|
||||||
|
if(ui.vmChooser.currentIndex() == 0):
|
||||||
|
QMessageBox.warning(this, ("提示"), ("Qemu 不支持该选项!"))
|
||||||
|
return
|
||||||
|
elif (ui.systemVersion.currentIndex() == 8):
|
||||||
|
if(ui.vmChooser.currentIndex() == 1):
|
||||||
|
QMessageBox.warning(this, ("提示"), ("VirtualBox 不支持该选项!"))
|
||||||
|
return
|
||||||
|
archFile.open(QIODevice.WriteOnly)
|
||||||
|
archFile.write("armhf")
|
||||||
|
archFile.close()
|
||||||
|
elif (ui.systemVersion.currentIndex() == 9):
|
||||||
|
if(ui.vmChooser.currentIndex() == 1):
|
||||||
|
QMessageBox.warning(this, ("提示"), ("VirtualBox 不支持该选项!"))
|
||||||
|
return
|
||||||
|
archFile.open(QIODevice.WriteOnly)
|
||||||
|
#archFile.write("aarch64")
|
||||||
|
archFile.close()
|
||||||
|
else:
|
||||||
|
if(ui.vmChooser.currentIndex() == 0 and QFile.exists(QDir.homePath() + "/.config/deepin-wine-runner/QEMU-EFI")):
|
||||||
|
QFile.remove(QDir.homePath() + "/.config/deepin-wine-runner/QEMU-EFI")
|
||||||
|
buildvbox(ui.isoPath.text(), ui.systemVersion.currentIndex(), ui.vmChooser.currentIndex())
|
||||||
|
ui.tabWidget.setCurrentIndex(1)
|
||||||
|
stopShowTime = 1
|
||||||
|
ui.CPUValue.showMessage(("提示:目前已经尝试开启虚拟机,如果在一段时间后依旧还没看到虚拟机窗口开启,请在菜单栏查看虚拟机日志"), 10000)
|
||||||
|
return
|
||||||
|
|
||||||
|
def on_getvbox_clicked():
|
||||||
|
QDesktopServices.openUrl(QUrl("https://www.virtualbox.org/wiki/Linux_Downloads"))
|
||||||
|
|
||||||
|
def on_getQemu_clicked():
|
||||||
|
os.system(("python3 '" + programPath + "/../RunCommandWithTerminal.py' pkexec '" + programPath + "/../QemuSystemInstall.sh'"))
|
||||||
|
|
||||||
|
def on_vmChooser_currentIndexChanged(index: int):
|
||||||
|
ui.qemuSetting.setDisabled(index)
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
def on_qemuSetting_clicked():
|
||||||
|
global show
|
||||||
|
show = QemuSetting()
|
||||||
|
show.show()
|
||||||
|
|
||||||
|
def on_addQemuDisk_triggered():
|
||||||
|
if(QFile.exists(QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("磁盘文件已存在,是否覆盖?\n覆盖后将无法恢复!")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
path = QFileDialog.getOpenFileName(this, ("选择 Qemu 镜像"), QDir.homePath(), ("Qemu镜像(*.qcow2 *.img *.raw *.qcow *.qed *.vdi *.vhdx *.vmdk)所有文件(*.*)"))
|
||||||
|
if(path == ""):
|
||||||
|
return
|
||||||
|
dir = QDir(QDir.homePath() + "/Qemu/Windows")
|
||||||
|
if(not dir.exists()):
|
||||||
|
dir.mkpath(QDir.homePath() + "/Qemu/Windows")
|
||||||
|
if(QFile.exists(QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
if(not QFile.remove(QDir.homePath() + "/Qemu/Windows/Windows.qcow2") or not QFile.copy(path, QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
QMessageBox.critical(this, ("提示"), ("添加错误!"))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if(not QFile.copy(path, QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
QMessageBox.critical(this, ("提示"), ("添加错误!"))
|
||||||
|
return
|
||||||
|
QMessageBox.information(this, ("提示"), ("添加完成!"))
|
||||||
|
|
||||||
|
def on_delQemuDisk_triggered():
|
||||||
|
if(not QFile.exists(QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
QMessageBox.information(this, ("提示"), ("不存在磁盘文件,无法导出"))
|
||||||
|
return
|
||||||
|
os.system(("xdg-open \"" + QDir.homePath() + "/Qemu/Windows/\""))
|
||||||
|
|
||||||
|
def on_addQemuDiskButton_clicked():
|
||||||
|
on_addQemuDisk_triggered()
|
||||||
|
|
||||||
|
def on_saveQemuDiskButton_clicked():
|
||||||
|
on_delQemuDisk_triggered()
|
||||||
|
|
||||||
|
def on_delQemuDiskButton_clicked():
|
||||||
|
if(not QFile.exists(QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
QMessageBox.information(this, ("提示"), ("不存在磁盘文件,无法移除"))
|
||||||
|
return
|
||||||
|
if(QMessageBox.question(this, ("提示"), ("是否删除?\n删除后将无法恢复!")) == QMessageBox.No):
|
||||||
|
return
|
||||||
|
if(not QFile.remove(QDir.homePath() + "/Qemu/Windows/Windows.qcow2")):
|
||||||
|
QMessageBox.critical(this, ("提示"), ("移除失败"))
|
||||||
|
return
|
||||||
|
QMessageBox.information(this, ("提示"), ("移除成功"))
|
||||||
|
|
||||||
|
def on_kvmTest_clicked():
|
||||||
|
if(os.system("which kvm-ok") and not QFile.exists(programPath + "/kvm-ok")):
|
||||||
|
QMessageBox.critical(this, ("错误"), ("未识别到命令 kvm-ok\n可以使用命令 sudo apt install cpu-checker 安装"))
|
||||||
|
return
|
||||||
|
kvm_ok_path = "kvm-ok"
|
||||||
|
if(not os.system("which kvm-ok")):
|
||||||
|
kvm_ok_path = "kvm-ok"
|
||||||
|
elif(QFile.exists(programPath + "/kvm-ok")):
|
||||||
|
kvm_ok_path = programPath + "/kvm-ok"
|
||||||
|
print(("使用"), kvm_ok_path)
|
||||||
|
process = QProcess()
|
||||||
|
process.start(kvm_ok_path)
|
||||||
|
process.waitForStarted()
|
||||||
|
process.waitForFinished()
|
||||||
|
if(process.exitCode()):
|
||||||
|
QMessageBox.critical(this, ("错误"), ("您的系统不支持使用 kvm:\n") + process.readAll())
|
||||||
|
return
|
||||||
|
QMessageBox.information(this, ("提示"), ("您的系统支持使用 kvm:\n") + process.readAll())
|
||||||
|
|
||||||
|
def on_actionVMRunlLog_triggered():
|
||||||
|
if(not os.path.exists("/tmp/windows-virtual-machine-installer-for-wine-runner-run.log")):
|
||||||
|
QMessageBox.information(this, ("提示"), ("没有日志文件"))
|
||||||
|
return
|
||||||
|
file = open("/tmp/windows-virtual-machine-installer-for-wine-runner-run.log")
|
||||||
|
QInputDialog.getMultiLineText(this, ("运行日志"), ("虚拟机运行日志"),file.read())
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
|
||||||
|
def on_actionVMTest_triggered():
|
||||||
|
# 运行 Demo
|
||||||
|
if(QFile.exists(programPath + "/test.qcow2")):
|
||||||
|
# 优先使用本地的磁盘
|
||||||
|
os.system(("qemu-system-i386 --hda '" + programPath + "/test.qcow2' -rtc base=localtime > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1"))
|
||||||
|
return
|
||||||
|
# 写入 disk 文件
|
||||||
|
file = QFile(":/TestDisk/test.qcow2")
|
||||||
|
# 计算随机数
|
||||||
|
writeFile = QFile("/tmp/indows-virtual-machine-installer-for-wine-runner-test-disk.qcow2")
|
||||||
|
file.open(QIODevice.ReadOnly)
|
||||||
|
writeFile.open(QIODevice.WriteOnly)
|
||||||
|
writeFile.write(file.readAll())
|
||||||
|
file.close()
|
||||||
|
writeFile.close()
|
||||||
|
os.system("qemu-system-i386 --hda /tmp/indows-virtual-machine-installer-for-wine-runner-test-disk.qcow2 -rtc base=localtime > /tmp/windows-virtual-machine-installer-for-wine-runner-run.log 2>&1")
|
||||||
|
|
||||||
|
def on_actionVMInstallLog_triggered():
|
||||||
|
if(not os.path.exists("/tmp/windows-virtual-machine-installer-for-wine-runner-install.log")):
|
||||||
|
QMessageBox.information(this, ("提示"), ("没有日志文件"))
|
||||||
|
return
|
||||||
|
file = open("/tmp/windows-virtual-machine-installer-for-wine-runner-install.log")
|
||||||
|
QInputDialog.getMultiLineText(this, ("安装日志"), ("虚拟机安装日志"),file.read())
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
def on_action_StopVirtualBox_triggered():
|
||||||
|
vmControl = vbox("")
|
||||||
|
vmControl.Stop()
|
||||||
|
|
||||||
|
|
||||||
|
def on_action_StopQemu_triggered():
|
||||||
|
vmControl = qemu("")
|
||||||
|
vmControl.Stop()
|
||||||
|
|
||||||
|
def on_actionQemuDiskAddSpace_triggered():
|
||||||
|
data = QInputDialog.getDouble(this, ("磁盘扩容"), "输入扩容多少GB\n注:1、扩容所需要的时间较长,程序可能会出现假死的情况,请不要关闭否则会导致虚拟磁盘损坏\n2、扩展后需要自行在虚拟机使用 Deepin Community Live CD、Live CD、Windows PE\n等工具调整系统分区大小才能使用")[0]
|
||||||
|
if(data <= 0):
|
||||||
|
return
|
||||||
|
# 开始扩容
|
||||||
|
result = qemu("").AddDiskSpace(QDir.homePath() + "/Qemu/Windows/Windows.qcow2", data)
|
||||||
|
qDebug() << "Exit Code: " << result
|
||||||
|
if(result):
|
||||||
|
QMessageBox.critical(this, ("错误"), ("扩容失败!"))
|
||||||
|
return
|
||||||
|
QMessageBox.information(this, ("提示"), ("扩容完成!"))
|
||||||
|
|
||||||
|
|
||||||
|
def on_getDCLC_triggered():
|
||||||
|
QDesktopServices.openUrl(QUrl("https://github.com/gfdgd-xi/deepin-community-live-cd/"))
|
||||||
|
|
||||||
|
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
||||||
|
if (__name__ == "__main__"):
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
else:
|
||||||
|
app = globalenv.get_value("app")
|
||||||
|
this = window = QMainWindow()
|
||||||
|
ui = ui_mainwindow.Ui_MainWindow()
|
||||||
|
ui.setupUi(window)
|
||||||
|
MainWindow()
|
||||||
|
# 绑定信号
|
||||||
|
ui.browser.clicked.connect(on_browser_clicked)
|
||||||
|
ui.install.clicked.connect(on_install_clicked)
|
||||||
|
ui.getvbox.clicked.connect(on_getvbox_clicked)
|
||||||
|
ui.getQemu.clicked.connect(on_getQemu_clicked)
|
||||||
|
ui.vmChooser.currentIndexChanged.connect(on_vmChooser_currentIndexChanged)
|
||||||
|
ui.qemuSetting.clicked.connect(on_qemuSetting_clicked)
|
||||||
|
ui.addQemuDisk.triggered.connect(on_addQemuDisk_triggered)
|
||||||
|
ui.delQemuDisk.triggered.connect(on_delQemuDisk_triggered)
|
||||||
|
ui.addQemuDiskButton.clicked.connect(on_addQemuDiskButton_clicked)
|
||||||
|
ui.delQemuDiskButton.clicked.connect(on_delQemuDiskButton_clicked)
|
||||||
|
ui.saveQemuDiskButton.clicked.connect(on_saveQemuDiskButton_clicked)
|
||||||
|
ui.kvmTest.clicked.connect(on_kvmTest_clicked)
|
||||||
|
ui.actionVMRunlLog.triggered.connect(on_actionVMRunlLog_triggered)
|
||||||
|
ui.actionVMInstallLog.triggered.connect(on_actionVMInstallLog_triggered)
|
||||||
|
ui.actionVMTest.triggered.connect(on_actionVMTest_triggered)
|
||||||
|
ui.action_StopQemu.triggered.connect(on_action_StopQemu_triggered)
|
||||||
|
ui.action_StopVirtualBox.triggered.connect(on_action_StopVirtualBox_triggered)
|
||||||
|
ui.actionQemuDiskAddSpace.triggered.connect(on_actionQemuDiskAddSpace_triggered)
|
||||||
|
ui.getDCLC.triggered.connect(on_getDCLC_triggered)
|
||||||
|
# 判断是否为 X86 架构,如果不是则屏蔽 VirtualBox 相关的选项
|
||||||
|
if (subprocess.getoutput("arch") != "x86_64"):
|
||||||
|
for i in [ui.action_StopVirtualBox, ui.getvbox]:
|
||||||
|
i.setVisible(False)
|
||||||
|
window.show()
|
||||||
|
if (__name__ == "__main__"):
|
||||||
|
sys.exit(app.exec_())
|
||||||
54
VM/novnc-client/main.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
from PyQt5.QtWidgets import QApplication, QMainWindow
|
||||||
|
from qvncwidget import QVNCWidget
|
||||||
|
#logging.basicConfig(level=logging.DEBUG) # DEBUG及以上的日志信息都会显示
|
||||||
|
class Window(QMainWindow):
|
||||||
|
def __init__(self):
|
||||||
|
super(Window, self).__init__()
|
||||||
|
self.setStyleSheet("background: black;")
|
||||||
|
self.setWindowTitle("QVNCWidget")
|
||||||
|
|
||||||
|
self.vnc = QVNCWidget(
|
||||||
|
parent=self,
|
||||||
|
#host="127.0.0.1", port=5905,
|
||||||
|
host="10.0.0.8", port=5900,
|
||||||
|
readOnly=False
|
||||||
|
)
|
||||||
|
|
||||||
|
self.setCentralWidget(self.vnc)
|
||||||
|
|
||||||
|
# you can disable mouse tracking if desired
|
||||||
|
self.vnc.setMouseTracking(True)
|
||||||
|
self.setAutoFillBackground(True)
|
||||||
|
def a():
|
||||||
|
while True:
|
||||||
|
import time
|
||||||
|
time.sleep(1)
|
||||||
|
#self.vnc.reconnect()
|
||||||
|
import threading
|
||||||
|
threading.Thread(target=a).start()
|
||||||
|
|
||||||
|
self.vnc.start()
|
||||||
|
|
||||||
|
|
||||||
|
def keyPressEvent(self, ev):
|
||||||
|
self.vnc.keyPressEvent(ev)
|
||||||
|
return super().keyPressEvent(ev) # in case you need the signal somewhere else in the window
|
||||||
|
|
||||||
|
def keyReleaseEvent(self, ev):
|
||||||
|
self.vnc.keyReleaseEvent(ev)
|
||||||
|
return super().keyReleaseEvent(ev) # in case you need the signal somewhere else in the window
|
||||||
|
|
||||||
|
def closeEvent(self, ev):
|
||||||
|
self.vnc.stop()
|
||||||
|
return super().closeEvent(ev)
|
||||||
|
|
||||||
|
#logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
window = Window()
|
||||||
|
window.resize(800, 600)
|
||||||
|
window.show()
|
||||||
|
|
||||||
|
sys.exit(app.exec_())
|
||||||
1
VM/novnc-client/qvncwidget/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .qvncwidget import QVNCWidget
|
||||||
237
VM/novnc-client/qvncwidget/easystruct.py
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
|
import struct
|
||||||
|
|
||||||
|
##
|
||||||
|
# reading
|
||||||
|
##
|
||||||
|
|
||||||
|
def read_float_buff(buffer, big_endian=False) -> float:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">f", buffer.read(4))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<f", buffer.read(4))[0]
|
||||||
|
|
||||||
|
def read_double_buff(buffer, big_endian=False) -> float:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">d", buffer.read(8))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<d", buffer.read(8))[0]
|
||||||
|
|
||||||
|
|
||||||
|
def read_uint8_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">B", buffer.read(1))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<B", buffer.read(1))[0]
|
||||||
|
|
||||||
|
def read_uint16_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">H", buffer.read(2))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<H", buffer.read(2))[0]
|
||||||
|
|
||||||
|
def read_uint32_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">I", buffer.read(4))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<I", buffer.read(4))[0]
|
||||||
|
|
||||||
|
def read_uint64_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">Q", buffer.read(8))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<Q", buffer.read(8))[0]
|
||||||
|
|
||||||
|
|
||||||
|
def read_sint8_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">b", buffer.read(1))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<b", buffer.read(1))[0]
|
||||||
|
|
||||||
|
def read_sint16_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">h", buffer.read(2))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<h", buffer.read(2))[0]
|
||||||
|
|
||||||
|
def read_sint32_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">i", buffer.read(4))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<i", buffer.read(4))[0]
|
||||||
|
|
||||||
|
def read_sint64_buff(buffer, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">q", buffer.read(8))[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<q", buffer.read(8))[0]
|
||||||
|
|
||||||
|
##
|
||||||
|
# writing
|
||||||
|
##
|
||||||
|
|
||||||
|
def write_float_buff(buffer, value: float, big_endian=False) -> None:
|
||||||
|
buffer.write(return_float_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_double_buff(buffer, value: float, big_endian=False) -> None:
|
||||||
|
buffer.write(return_double_bytes(value, big_endian))
|
||||||
|
|
||||||
|
|
||||||
|
def write_uint8_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_uint8_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_uint16_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_uint16_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_uint32_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_uint32_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_uint64_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_uint64_bytes(value, big_endian))
|
||||||
|
|
||||||
|
|
||||||
|
def write_sint8_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_sint8_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_sint16_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_sint16_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_sint32_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_sint32_bytes(value, big_endian))
|
||||||
|
|
||||||
|
def write_sint64_buff(buffer, value: int, big_endian=False) -> None:
|
||||||
|
buffer.write(return_sint64_bytes(value, big_endian))
|
||||||
|
|
||||||
|
##
|
||||||
|
# return bytes
|
||||||
|
##
|
||||||
|
|
||||||
|
def return_float_bytes(value: float, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">f", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<f", value)
|
||||||
|
|
||||||
|
def return_double_bytes(value: float, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">d", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<d", value)
|
||||||
|
|
||||||
|
|
||||||
|
def return_uint8_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">B", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<B", value)
|
||||||
|
|
||||||
|
def return_uint16_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">H", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<H", value)
|
||||||
|
|
||||||
|
def return_uint32_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">I", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<I", value)
|
||||||
|
|
||||||
|
def return_uint64_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">Q", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<Q", value)
|
||||||
|
|
||||||
|
|
||||||
|
def return_sint8_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">b", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<b", value)
|
||||||
|
|
||||||
|
def return_sint16_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">h", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<h", value)
|
||||||
|
|
||||||
|
def return_sint32_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">i", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<i", value)
|
||||||
|
|
||||||
|
def return_sint64_bytes(value: int, big_endian=False) -> bytes:
|
||||||
|
if big_endian:
|
||||||
|
return struct.pack(">q", value)
|
||||||
|
else:
|
||||||
|
return struct.pack("<q", value)
|
||||||
|
|
||||||
|
##
|
||||||
|
# return val
|
||||||
|
##
|
||||||
|
|
||||||
|
def return_float_val(data: bytes, big_endian=False) -> float:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">f", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<f", data)[0]
|
||||||
|
|
||||||
|
def return_double_val(data: bytes, big_endian=False) -> float:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">d", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<d", data)[0]
|
||||||
|
|
||||||
|
|
||||||
|
def return_uint8_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">B", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<B", data)[0]
|
||||||
|
|
||||||
|
def return_uint16_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">H", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<H", data)[0]
|
||||||
|
|
||||||
|
def return_uint32_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">I", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<I", data)[0]
|
||||||
|
|
||||||
|
def return_uint64_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">Q", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<Q", data)[0]
|
||||||
|
|
||||||
|
|
||||||
|
def return_sint8_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">b", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<b", data)[0]
|
||||||
|
|
||||||
|
def return_sint16_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">h", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<h", data)[0]
|
||||||
|
|
||||||
|
def return_sint32_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">i", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<i", data)[0]
|
||||||
|
|
||||||
|
def return_sint64_val(data: bytes, big_endian=False) -> int:
|
||||||
|
if big_endian:
|
||||||
|
return struct.unpack(">q", data)[0]
|
||||||
|
else:
|
||||||
|
return struct.unpack("<q", data)[0]
|
||||||
690
VM/novnc-client/qvncwidget/qvncwidget.py
Normal file
@@ -0,0 +1,690 @@
|
|||||||
|
"""
|
||||||
|
Qt Widget for displaying VNC framebuffer using RFB protocol
|
||||||
|
|
||||||
|
(c) zocker-160 2024
|
||||||
|
licensed under GPLv3
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import time
|
||||||
|
|
||||||
|
from PyQt5.QtCore import (
|
||||||
|
QSize,
|
||||||
|
Qt,
|
||||||
|
pyqtSignal,
|
||||||
|
QSemaphore
|
||||||
|
)
|
||||||
|
from PyQt5.QtGui import (
|
||||||
|
QImage,
|
||||||
|
QPaintEvent,
|
||||||
|
QPainter,
|
||||||
|
QColor,
|
||||||
|
QBrush,
|
||||||
|
QPixmap,
|
||||||
|
QResizeEvent,
|
||||||
|
QKeyEvent,
|
||||||
|
QMouseEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from PyQt5.QtWidgets import (
|
||||||
|
QWidget,
|
||||||
|
QLabel,
|
||||||
|
QWidget,
|
||||||
|
QOpenGLWidget
|
||||||
|
)
|
||||||
|
|
||||||
|
from qvncwidget.rfb import RFBClient
|
||||||
|
from qvncwidget.rfbhelpers import RFBPixelformat, RFBInput
|
||||||
|
|
||||||
|
log = logging.getLogger("QVNCWidget")
|
||||||
|
|
||||||
|
class QVNCWidget(QWidget, RFBClient):
|
||||||
|
|
||||||
|
onInitialResize = pyqtSignal(QSize)
|
||||||
|
|
||||||
|
def __init__(self, parent: QWidget,
|
||||||
|
host: str, port = 5900, password: str = None,
|
||||||
|
readOnly = False):
|
||||||
|
super().__init__(
|
||||||
|
parent=parent,
|
||||||
|
host=host, port=port, password=password
|
||||||
|
)
|
||||||
|
self.readOnly = readOnly
|
||||||
|
|
||||||
|
self.backbuffer: QImage = None
|
||||||
|
self.frontbuffer: QImage = None
|
||||||
|
|
||||||
|
self.setMouseTracking(not self.readOnly)
|
||||||
|
self.setMinimumSize(1, 1) # make window scalable
|
||||||
|
|
||||||
|
self.mouseButtonMask = 0
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
self.startConnection()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.closeConnection()
|
||||||
|
|
||||||
|
def onConnectionMade(self):
|
||||||
|
log.info("VNC handshake done")
|
||||||
|
|
||||||
|
self.setPixelFormat(RFBPixelformat.getRGB32())
|
||||||
|
|
||||||
|
self.PIX_FORMAT = QImage.Format.Format_RGB32
|
||||||
|
self.backbuffer = QImage(self.vncWidth, self.vncHeight, self.PIX_FORMAT)
|
||||||
|
self.onInitialResize.emit(QSize(self.vncWidth, self.vncHeight))
|
||||||
|
|
||||||
|
def onRectangleUpdate(self,
|
||||||
|
x: int, y: int, width: int, height: int, data: bytes):
|
||||||
|
|
||||||
|
if self.backbuffer is None:
|
||||||
|
log.warning("backbuffer is None")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
log.debug("drawing backbuffer")
|
||||||
|
|
||||||
|
#with open(f"{width}x{height}.data", "wb") as f:
|
||||||
|
# f.write(data)
|
||||||
|
|
||||||
|
t1 = time.time()
|
||||||
|
|
||||||
|
painter = QPainter(self.backbuffer)
|
||||||
|
painter.drawImage(x, y, QImage(data, width, height, self.PIX_FORMAT))
|
||||||
|
painter.end()
|
||||||
|
|
||||||
|
log.debug(f"painting took: {(time.time() - t1)*1e3} ms")
|
||||||
|
|
||||||
|
del painter
|
||||||
|
del data
|
||||||
|
|
||||||
|
def onFramebufferUpdateFinished(self):
|
||||||
|
log.debug("FB Update finished")
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def paintEvent(self, a0: QPaintEvent):
|
||||||
|
#log.debug("Paint event")
|
||||||
|
painter = QPainter(self)
|
||||||
|
|
||||||
|
if self.backbuffer is None:
|
||||||
|
log.debug("backbuffer is None")
|
||||||
|
painter.fillRect(0, 0, self.width(), self.height(), Qt.GlobalColor.black)
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.frontbuffer = self.backbuffer.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.AspectRatioMode.KeepAspectRatio,
|
||||||
|
Qt.TransformationMode.SmoothTransformation
|
||||||
|
)
|
||||||
|
painter.drawImage(0, 0, self.frontbuffer)
|
||||||
|
|
||||||
|
painter.end()
|
||||||
|
|
||||||
|
# Mouse events
|
||||||
|
|
||||||
|
def mousePressEvent(self, ev: QMouseEvent):
|
||||||
|
if self.readOnly or not self.frontbuffer: return
|
||||||
|
self.mouseButtonMask = RFBInput.fromQMouseEvent(ev, True, self.mouseButtonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.mouseButtonMask)
|
||||||
|
|
||||||
|
def mouseReleaseEvent(self, ev: QMouseEvent):
|
||||||
|
if self.readOnly or not self.frontbuffer: return
|
||||||
|
self.mouseButtonMask = RFBInput.fromQMouseEvent(ev, False, self.mouseButtonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.mouseButtonMask)
|
||||||
|
|
||||||
|
def mouseMoveEvent(self, ev: QMouseEvent):
|
||||||
|
if self.readOnly or not self.frontbuffer: return
|
||||||
|
try:
|
||||||
|
# 忽略拖动导致的问题
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.mouseButtonMask)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _getRemoteRel(self, ev: QMouseEvent) -> tuple:
|
||||||
|
xPos = (ev.localPos().x() / self.frontbuffer.width()) * self.vncWidth
|
||||||
|
yPos = (ev.localPos().y() / self.frontbuffer.height()) * self.vncHeight
|
||||||
|
|
||||||
|
return int(xPos), int(yPos)
|
||||||
|
|
||||||
|
# Key events
|
||||||
|
|
||||||
|
def keyPressEvent(self, ev: QKeyEvent):
|
||||||
|
if self.readOnly: return
|
||||||
|
self.keyEvent(RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=1)
|
||||||
|
|
||||||
|
def keyReleaseEvent(self, ev: QKeyEvent):
|
||||||
|
if self.readOnly: return
|
||||||
|
self.keyEvent(RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=0)
|
||||||
|
|
||||||
|
|
||||||
|
# other experimental implementations
|
||||||
|
|
||||||
|
class QVNCWidgetGL(QOpenGLWidget, RFBClient):
|
||||||
|
|
||||||
|
IMG_FORMAT = QImage.Format_RGB32
|
||||||
|
|
||||||
|
onInitialResize = pyqtSignal(QSize)
|
||||||
|
#onUpdatePixmap = pyqtSignal(int, int, int, int, bytes)
|
||||||
|
onUpdatePixmap = pyqtSignal()
|
||||||
|
onSetPixmap = pyqtSignal()
|
||||||
|
|
||||||
|
onKeyPress = pyqtSignal(QKeyEvent)
|
||||||
|
onKeyRelease = pyqtSignal(QKeyEvent)
|
||||||
|
|
||||||
|
def __init__(self, parent,
|
||||||
|
host, port=5900, password: str=None,
|
||||||
|
mouseTracking=False):
|
||||||
|
|
||||||
|
#super(QOpenGLWidget, self).__init__()
|
||||||
|
#super(RFBClient, self).__init__(
|
||||||
|
super().__init__(
|
||||||
|
parent=parent,
|
||||||
|
host=host,
|
||||||
|
port=port,
|
||||||
|
password=password,
|
||||||
|
daemonThread=True
|
||||||
|
)
|
||||||
|
|
||||||
|
#self.setAlignment(Qt.AlignCenter)
|
||||||
|
|
||||||
|
#self.onUpdatePixmap.connect(self._updateImage)
|
||||||
|
#self.onSetPixmap.connect(self._setImage)
|
||||||
|
self.onSetPixmap.connect(self._updateImage)
|
||||||
|
|
||||||
|
self.acceptMouseEvents = False # mouse events are not accepted at first
|
||||||
|
self.setMouseTracking(mouseTracking)
|
||||||
|
|
||||||
|
# Allow Resizing
|
||||||
|
self.setMinimumSize(1, 1)
|
||||||
|
|
||||||
|
self.data = list(tuple())
|
||||||
|
self.dataMonitor = QSemaphore(0)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
self.startConnection()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.closeConnection()
|
||||||
|
|
||||||
|
def onConnectionMade(self):
|
||||||
|
log.info("VNC handshake done")
|
||||||
|
|
||||||
|
self.setPixelFormat(RFBPixelformat.getRGB32())
|
||||||
|
self.onInitialResize.emit(QSize(self.vncWidth, self.vncHeight))
|
||||||
|
self._initKeypress()
|
||||||
|
self._initMouse()
|
||||||
|
|
||||||
|
def onRectangleUpdate(self,
|
||||||
|
x: int, y: int, width: int, height: int, data: bytes):
|
||||||
|
#img = QImage(data, width, height, self.IMG_FORMAT)
|
||||||
|
#self.onUpdatePixmap.emit(x, y, width, height, data)
|
||||||
|
|
||||||
|
#self.dataMonitor.acquire(1)
|
||||||
|
|
||||||
|
self.data.append((x, y, width, height, data))
|
||||||
|
#self.data = (x, y, width, height, data)
|
||||||
|
#self.dataMonitor.release(1)
|
||||||
|
|
||||||
|
#self.onUpdatePixmap.emit()
|
||||||
|
|
||||||
|
#else:
|
||||||
|
# print("AAAAAAAAAAAAAA", "MONITOR AQUIRE FAILED")
|
||||||
|
|
||||||
|
def onFramebufferUpdateFinished(self):
|
||||||
|
self.onSetPixmap.emit()
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.pixmap:
|
||||||
|
#self.setPixmap(QPixmap.fromImage(self.image))
|
||||||
|
self.resizeEvent(None)
|
||||||
|
|
||||||
|
def onFatalError(self, error: Exception):
|
||||||
|
log.error(str(error))
|
||||||
|
#logging.exception(str(error))
|
||||||
|
#self.reconnect()
|
||||||
|
|
||||||
|
#def _updateImage(self, x: int, y: int, width: int, height: int, data: bytes):
|
||||||
|
def _updateImage(self):
|
||||||
|
print("update image")
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
#if not self.screen:
|
||||||
|
# self.screen = QImage(width, height, self.IMG_FORMAT)
|
||||||
|
# self.screen.fill(Qt.red)
|
||||||
|
# self.screenPainter = QPainter(self.screen)
|
||||||
|
|
||||||
|
#self.painter.beginNativePainting()
|
||||||
|
#self.painter.drawPixmapFragments()
|
||||||
|
|
||||||
|
#with open("/tmp/images/test.raw", "wb") as f:
|
||||||
|
# f.write(data)
|
||||||
|
|
||||||
|
#p = QPainter(self.screen)
|
||||||
|
|
||||||
|
#self.screenPainter.drawImage(
|
||||||
|
# x, y, QImage(data, width, height, self.IMG_FORMAT))
|
||||||
|
|
||||||
|
#p.end()
|
||||||
|
|
||||||
|
#self.repaint()
|
||||||
|
#self.update()
|
||||||
|
|
||||||
|
def _setPixmap(self):
|
||||||
|
if self.pixmap:
|
||||||
|
self.setPixmap(
|
||||||
|
self.pixmap.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _setImage(self):
|
||||||
|
if self.screen:
|
||||||
|
self.setPixmap(QPixmap.fromImage(
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
)
|
||||||
|
))
|
||||||
|
self.acceptMouseEvents = True # mouse events are getting accepted
|
||||||
|
|
||||||
|
# Passed events
|
||||||
|
|
||||||
|
def _keyPress(self, ev: QKeyEvent):
|
||||||
|
self.keyEvent(
|
||||||
|
RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=1)
|
||||||
|
|
||||||
|
def _keyRelease(self, ev: QKeyEvent):
|
||||||
|
self.keyEvent(
|
||||||
|
RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=0)
|
||||||
|
|
||||||
|
# Window events
|
||||||
|
|
||||||
|
def paintEvent(self, e: QPaintEvent):
|
||||||
|
print("paint event")
|
||||||
|
|
||||||
|
#self.dataMonitor.acquire(1)
|
||||||
|
|
||||||
|
#while self.dataMonitor.tryAcquire(1):
|
||||||
|
while len(self.data) > 0:
|
||||||
|
x, y, w, h, data = self.data.pop(0)
|
||||||
|
|
||||||
|
p = QPainter(self)
|
||||||
|
|
||||||
|
#p.setPen(QColor(255, 0, 0))
|
||||||
|
#p.drawText(e.rect(), Qt.AlignCenter, str(self.dataMonitor.available()))
|
||||||
|
|
||||||
|
p.drawImage(x, y, QImage(data, w, h, self.IMG_FORMAT))
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
#self.dataMonitor.release(1)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
p = QPainter(self)
|
||||||
|
p.fillRect(e.rect(), QBrush(QColor(255, 255, 255)))
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.dataMonitor.tryAcquire(1):
|
||||||
|
x, y, w, h, data = self.data
|
||||||
|
|
||||||
|
p = QPainter(self)
|
||||||
|
p.drawImage(x, y, QImage(data, w, h, self.IMG_FORMAT))
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
self.dataMonitor.release(1)
|
||||||
|
|
||||||
|
print("CCCCC", "Image painted diggah")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("BBBBBBBBB", "aquire monitor failed")
|
||||||
|
|
||||||
|
#return super().paintEvent(a0)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not self.screen:
|
||||||
|
self.screen = QImage(self.size(), self.IMG_FORMAT)
|
||||||
|
self.screen.fill(Qt.red)
|
||||||
|
self.screenPainter = QPainter(self.screen)
|
||||||
|
|
||||||
|
p = QPainter()
|
||||||
|
p.begin(self)
|
||||||
|
p.drawImage(0, 0,
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
))
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
def resizeEvent(self, e: QResizeEvent):
|
||||||
|
return super().resizeEvent(e)
|
||||||
|
|
||||||
|
def resizeGL(self, w: int, h: int):
|
||||||
|
print("RESIZE THAT BITCH!!!", w, h)
|
||||||
|
#return super().resizeGL(w, h)
|
||||||
|
|
||||||
|
def resizeEvent_(self, a0: QResizeEvent):
|
||||||
|
#print("RESIZE!", self.width(), self.height())
|
||||||
|
#return super().resizeEvent(a0)
|
||||||
|
if self.screen:
|
||||||
|
self.setPixmap(QPixmap.fromImage(
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
))
|
||||||
|
)
|
||||||
|
return super().resizeEvent(a0)
|
||||||
|
|
||||||
|
def mousePressEvent(self, ev: QMouseEvent):
|
||||||
|
#print(ev.localPos(), ev.button())
|
||||||
|
#print(self.height() - self.pixmap().height())
|
||||||
|
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.buttonMask = RFBInput.fromQMouseEvent(ev, True, self.buttonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
return super().mousePressEvent(ev)
|
||||||
|
|
||||||
|
def mouseReleaseEvent(self, ev: QMouseEvent):
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.buttonMask = RFBInput.fromQMouseEvent(ev, False, self.buttonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
return super().mouseReleaseEvent(ev)
|
||||||
|
|
||||||
|
def mouseMoveEvent(self, ev: QMouseEvent):
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
# FIXME: The pixmap is assumed to be aligned center.
|
||||||
|
def _getRemoteRel(self, ev: QMouseEvent) -> tuple:
|
||||||
|
# FIXME: this code is ugly as fk
|
||||||
|
|
||||||
|
# y coord is kinda fucked up
|
||||||
|
yDiff = (self.height() - self.pixmap().height()) / 2
|
||||||
|
yPos = ev.localPos().y() - yDiff
|
||||||
|
if yPos < 0: yPos = 0
|
||||||
|
if yPos > self.pixmap().height(): yPos = self.pixmap().height()
|
||||||
|
|
||||||
|
yPos = self._calcRemoteRel(
|
||||||
|
yPos, self.pixmap().height(), self.vncHeight)
|
||||||
|
|
||||||
|
# x coord is kinda fucked up, too
|
||||||
|
xDiff = (self.width() - self.pixmap().width()) / 2
|
||||||
|
xPos = ev.localPos().x() - xDiff
|
||||||
|
if xPos < 0: xPos = 0
|
||||||
|
if xPos > self.pixmap().width(): xPos = self.pixmap().width()
|
||||||
|
|
||||||
|
xPos = self._calcRemoteRel(
|
||||||
|
xPos, self.pixmap().width(), self.vncWidth)
|
||||||
|
|
||||||
|
return xPos, yPos
|
||||||
|
|
||||||
|
def _calcRemoteRel(self, locRel, locMax, remoteMax) -> int:
|
||||||
|
return int( (locRel / locMax) * remoteMax )
|
||||||
|
|
||||||
|
def _initMouse(self):
|
||||||
|
self.buttonMask = 0 # pressed buttons (bit fields)
|
||||||
|
|
||||||
|
def _initKeypress(self):
|
||||||
|
self.onKeyPress.connect(self._keyPress)
|
||||||
|
self.onKeyRelease.connect(self._keyRelease)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.stop()
|
||||||
|
|
||||||
|
def __exit__(self, *args):
|
||||||
|
self.stop()
|
||||||
|
self.deleteLater()
|
||||||
|
|
||||||
|
class QVNCWidget_old(QLabel, RFBClient):
|
||||||
|
|
||||||
|
IMG_FORMAT = QImage.Format_RGB32
|
||||||
|
|
||||||
|
onInitialResize = pyqtSignal(QSize)
|
||||||
|
onUpdatePixmap = pyqtSignal(int, int, int, int, bytes)
|
||||||
|
onSetPixmap = pyqtSignal()
|
||||||
|
|
||||||
|
onKeyPress = pyqtSignal(QKeyEvent)
|
||||||
|
onKeyRelease = pyqtSignal(QKeyEvent)
|
||||||
|
|
||||||
|
def __init__(self, parent,
|
||||||
|
host, port=5900, password: str=None,
|
||||||
|
mouseTracking=False):
|
||||||
|
super().__init__(
|
||||||
|
parent=parent,
|
||||||
|
host=host,
|
||||||
|
port=port,
|
||||||
|
password=password,
|
||||||
|
daemonThread=True
|
||||||
|
)
|
||||||
|
#import faulthandler
|
||||||
|
#faulthandler.enable()
|
||||||
|
self.screen: QImage = None
|
||||||
|
|
||||||
|
# FIXME: The pixmap is assumed to be aligned center.
|
||||||
|
self.setAlignment(Qt.AlignCenter)
|
||||||
|
|
||||||
|
self.onUpdatePixmap.connect(self._updateImage)
|
||||||
|
self.onSetPixmap.connect(self._setImage)
|
||||||
|
|
||||||
|
self.acceptMouseEvents = False # mouse events are not accepted at first
|
||||||
|
self.setMouseTracking(mouseTracking)
|
||||||
|
|
||||||
|
# Allow Resizing
|
||||||
|
self.setMinimumSize(1,1)
|
||||||
|
|
||||||
|
def _initMouse(self):
|
||||||
|
self.buttonMask = 0 # pressed buttons (bit fields)
|
||||||
|
|
||||||
|
def _initKeypress(self):
|
||||||
|
self.onKeyPress.connect(self._keyPress)
|
||||||
|
self.onKeyRelease.connect(self._keyRelease)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
self.startConnection()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.closeConnection()
|
||||||
|
if self.screenPainter: self.screenPainter.end()
|
||||||
|
|
||||||
|
def onConnectionMade(self):
|
||||||
|
self.onInitialResize.emit(QSize(self.vncWidth, self.vncHeight))
|
||||||
|
self.setPixelFormat(RFBPixelformat.getRGB32())
|
||||||
|
self._initKeypress()
|
||||||
|
self._initMouse()
|
||||||
|
|
||||||
|
def onRectangleUpdate(self,
|
||||||
|
x: int, y: int, width: int, height: int, data: bytes):
|
||||||
|
#img = QImage(data, width, height, self.IMG_FORMAT)
|
||||||
|
self.onUpdatePixmap.emit(x, y, width, height, data)
|
||||||
|
|
||||||
|
def onFramebufferUpdateFinished(self):
|
||||||
|
self.onSetPixmap.emit()
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.pixmap:
|
||||||
|
#self.setPixmap(QPixmap.fromImage(self.image))
|
||||||
|
self.resizeEvent(None)
|
||||||
|
|
||||||
|
def onFatalError(self, error: Exception):
|
||||||
|
log.error(str(error))
|
||||||
|
#logging.exception(str(error))
|
||||||
|
#self.reconnect()
|
||||||
|
|
||||||
|
def _updateImage(self, x: int, y: int, width: int, height: int, data: bytes):
|
||||||
|
if not self.screen:
|
||||||
|
self.screen = QImage(width, height, self.IMG_FORMAT)
|
||||||
|
self.screen.fill(Qt.red)
|
||||||
|
self.screenPainter = QPainter(self.screen)
|
||||||
|
|
||||||
|
#self.painter.beginNativePainting()
|
||||||
|
#self.painter.drawPixmapFragments()
|
||||||
|
|
||||||
|
#with open("/tmp/images/test.raw", "wb") as f:
|
||||||
|
# f.write(data)
|
||||||
|
|
||||||
|
#p = QPainter(self.screen)
|
||||||
|
self.screenPainter.drawImage(
|
||||||
|
x, y, QImage(data, width, height, self.IMG_FORMAT))
|
||||||
|
#p.end()
|
||||||
|
|
||||||
|
#self.repaint()
|
||||||
|
#self.update()
|
||||||
|
|
||||||
|
def _drawPixmap(self, x: int, y: int, pix: QPixmap):
|
||||||
|
#self.paintLock.acquire()
|
||||||
|
self.pixmap = pix
|
||||||
|
|
||||||
|
if not self.painter:
|
||||||
|
self.painter = QPainter(self.pixmap)
|
||||||
|
else:
|
||||||
|
print("DRAW PIXMAP:", x, y, self.pixmap, self.painter, pix, pix.isNull())
|
||||||
|
self.painter.drawPixmap(x, y, self.pixmap)
|
||||||
|
#self.paintLock.release()
|
||||||
|
|
||||||
|
def _drawPixmap2(self, x: int, y: int, pix: QPixmap, data: bytes):
|
||||||
|
if not self.pixmap or (
|
||||||
|
x == 0 and y == 0 and
|
||||||
|
pix.width() == self.pixmap.width() and pix.height() == self.pixmap.height()):
|
||||||
|
|
||||||
|
self.pixmap = pix.copy()
|
||||||
|
self._setPixmap()
|
||||||
|
return
|
||||||
|
|
||||||
|
import time
|
||||||
|
print("DRAW PIXMAP:", x, y, self.pixmap.width(), self.pixmap.height(), pix.width(), pix.height())
|
||||||
|
_t = time.time()
|
||||||
|
#self.pixmap.save(f"/tmp/images/imgP_{_t}", "jpg")
|
||||||
|
#with open(f"/tmp/images/img_{_t}.raw", "wb") as f:
|
||||||
|
# f.write(data)
|
||||||
|
#pix.save(f"/tmp/images/img_{_t}", "jpg")
|
||||||
|
|
||||||
|
painter = QPainter(self.pixmap)
|
||||||
|
painter.drawPixmap(x, y, pix)
|
||||||
|
painter.end()
|
||||||
|
#self._setPixmap()
|
||||||
|
|
||||||
|
def _setPixmap(self):
|
||||||
|
if self.pixmap:
|
||||||
|
self.setPixmap(
|
||||||
|
self.pixmap.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _setImage(self):
|
||||||
|
if self.screen:
|
||||||
|
self.setPixmap(QPixmap.fromImage(
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
)
|
||||||
|
))
|
||||||
|
self.acceptMouseEvents = True # mouse events are getting accepted
|
||||||
|
|
||||||
|
# Passed events
|
||||||
|
|
||||||
|
def _keyPress(self, ev: QKeyEvent):
|
||||||
|
self.keyEvent(
|
||||||
|
RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=1)
|
||||||
|
|
||||||
|
def _keyRelease(self, ev: QKeyEvent):
|
||||||
|
self.keyEvent(
|
||||||
|
RFBInput.fromQKeyEvent(ev.key(), ev.text()), down=0)
|
||||||
|
|
||||||
|
# Window events
|
||||||
|
|
||||||
|
def paintEvent(self, a0: QPaintEvent):
|
||||||
|
return super().paintEvent(a0)
|
||||||
|
if not self.screen:
|
||||||
|
self.screen = QImage(self.size(), self.IMG_FORMAT)
|
||||||
|
self.screen.fill(Qt.red)
|
||||||
|
self.screenPainter = QPainter(self.screen)
|
||||||
|
|
||||||
|
p = QPainter()
|
||||||
|
p.begin(self)
|
||||||
|
p.drawImage(0, 0,
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
))
|
||||||
|
p.end()
|
||||||
|
|
||||||
|
def resizeEvent(self, a0: QResizeEvent):
|
||||||
|
#print("RESIZE!", self.width(), self.height())
|
||||||
|
#return super().resizeEvent(a0)
|
||||||
|
if self.screen:
|
||||||
|
self.setPixmap(QPixmap.fromImage(
|
||||||
|
self.screen.scaled(
|
||||||
|
self.width(), self.height(),
|
||||||
|
Qt.KeepAspectRatio,
|
||||||
|
Qt.SmoothTransformation
|
||||||
|
))
|
||||||
|
)
|
||||||
|
return super().resizeEvent(a0)
|
||||||
|
|
||||||
|
def mousePressEvent(self, ev: QMouseEvent):
|
||||||
|
#print(ev.localPos(), ev.button())
|
||||||
|
#print(self.height() - self.pixmap().height())
|
||||||
|
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.buttonMask = RFBInput.fromQMouseEvent(ev, True, self.buttonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
return super().mousePressEvent(ev)
|
||||||
|
|
||||||
|
def mouseReleaseEvent(self, ev: QMouseEvent):
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.buttonMask = RFBInput.fromQMouseEvent(ev, False, self.buttonMask)
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
return super().mouseReleaseEvent(ev)
|
||||||
|
|
||||||
|
def mouseMoveEvent(self, ev: QMouseEvent):
|
||||||
|
if self.acceptMouseEvents: # need pixmap instance
|
||||||
|
self.pointerEvent(*self._getRemoteRel(ev), self.buttonMask)
|
||||||
|
|
||||||
|
# FIXME: The pixmap is assumed to be aligned center.
|
||||||
|
def _getRemoteRel(self, ev: QMouseEvent) -> tuple:
|
||||||
|
# FIXME: this code is ugly as fk
|
||||||
|
|
||||||
|
# y coord is kinda fucked up
|
||||||
|
yDiff = (self.height() - self.pixmap().height()) / 2
|
||||||
|
yPos = ev.localPos().y() - yDiff
|
||||||
|
if yPos < 0: yPos = 0
|
||||||
|
if yPos > self.pixmap().height(): yPos = self.pixmap().height()
|
||||||
|
|
||||||
|
yPos = self._calcRemoteRel(
|
||||||
|
yPos, self.pixmap().height(), self.vncHeight)
|
||||||
|
|
||||||
|
# x coord is kinda fucked up, too
|
||||||
|
xDiff = (self.width() - self.pixmap().width()) / 2
|
||||||
|
xPos = ev.localPos().x() - xDiff
|
||||||
|
if xPos < 0: xPos = 0
|
||||||
|
if xPos > self.pixmap().width(): xPos = self.pixmap().width()
|
||||||
|
|
||||||
|
xPos = self._calcRemoteRel(
|
||||||
|
xPos, self.pixmap().width(), self.vncWidth)
|
||||||
|
|
||||||
|
return xPos, yPos
|
||||||
|
|
||||||
|
def _calcRemoteRel(self, locRel, locMax, remoteMax) -> int:
|
||||||
|
return int( (locRel / locMax) * remoteMax )
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.stop()
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
self.stop()
|
||||||
|
self.deleteLater()
|
||||||