3 Commits

Author SHA1 Message Date
Oskar Manhart
894fc02e8a Merge branch 'main' into add-contribution-guidelines 2024-09-14 17:49:52 +02:00
Oskar Manhart
ea3c201624 Merge branch 'add-contribution-guidelines' of github.com:winapps-org/winapps into add-contribution-guidelines 2024-09-14 17:49:22 +02:00
Oskar Manhart
28890d4f1b fix: fix license on ms access 2024-09-10 10:28:07 +02:00
58 changed files with 413 additions and 1422 deletions

21
.github/workflows/lictool.yaml vendored Normal file
View File

@@ -0,0 +1,21 @@
on:
pull_request:
push:
branches: [main]
jobs:
lictool:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.x
- uses: pre-commit/action@v3.0.1
with:
extra_args: license-tools
- uses: pre-commit-ci/lite-action@v1.0.2
if: always()

View File

@@ -1,40 +0,0 @@
name: "Update Flake Packages"
permissions:
contents: write
pull-requests: write
on:
pull_request:
branches: [main]
types: [labeled]
schedule:
- cron: "0 10 * * 0" # https://crontab.guru/#0_10_*_*_0
jobs:
build:
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'rebuild nix')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@main
with:
trust-runner-user: true
- name: Set up cache
uses: cachix/cachix-action@v15
with:
name: winapps
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
- name: Update flake packages
uses: winapps-org/nix-update-action@v1.4.0
with:
extra-args: --version=branch
skip-pr: "${{ github.event_name == 'pull_request' }}"
- name: Build packages
run: nix build .#winapps .#winapps-launcher

View File

@@ -1,37 +0,0 @@
name: Update submodules
on:
repository_dispatch:
types: update
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Update module
run: |
pushd WinApps-Launcher
branch=$(git rev-parse --abbrev-ref origin/HEAD | sed "s|origin/||")
git config remote.origin.fetch "+refs/heads/$branch:refs/remotes/origin/$branch"
git fetch --depth=1 origin "refs/heads/$branch"
popd
git submodule update --init --remote WinApps-Launcher
- name: Commit and push
uses: EndBug/add-and-commit@v9
with:
add: WinApps-Launcher
default_author: github_actions
message: "Update submodules"
push: false
- name: Create PR
uses: peter-evans/create-pull-request@v7
with:
branch: chore/update_submodules
delete-branch: true
title: "Update submodules"

25
.github/workflows/update.yaml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: Update submodules
on:
repository_dispatch:
types: update
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Update module
run: |
git submodule update --init --recursive --checkout -f
- name: Commit and push
uses: EndBug/add-and-commit@v9
with:
add: "WinApps-Launcher"
default_author: github_actions
message: "Update submodules"
push: true
fetch: true

View File

@@ -0,0 +1,70 @@
{
"author": {
"from_git": true,
"latest_year_only": true
},
"title": false,
"style_override_for_suffix": {
".yaml": "POUND_STYLE",
".ps1": "POUND_STYLE",
".bat": "BATCH_STYLE",
"": "POUND_STYLE"
},
"exclude": [
"^\\.[^/]+",
"/\\.[^/]+",
"^(.+)\\.(md|svg|png|reg|gif)",
"^(fonts|WinApps-Launcher)(/.*)?",
"apps/access/info",
"apps/access-o365-x86/info",
"apps/access-x86/info",
"apps/acrobat-x-pro/info",
"apps/adobe-cc/info",
"apps/aftereffects-cc/info",
"apps/audition-cc/info",
"apps/bridge-cc/info",
"apps/bridge-cs6/info",
"apps/bridge-cs6-x86/info",
"apps/cmd/info",
"apps/excel/info",
"apps/excel-o365-x86/info",
"apps/excel-x86/info",
"apps/explorer/info",
"apps/iexplorer/info",
"apps/illustrator-cc/info",
"apps/indesign-cc/info",
"apps/lightroom-cc/info",
"apps/onenote/info",
"apps/onenote-o365-x86/info",
"apps/onenote-x86/info",
"apps/outlook/info",
"apps/outlook-o365-x86/info",
"apps/outlook-x86/info",
"apps/photoshop-cc/info",
"apps/photoshop-cs6/info",
"apps/photoshop-cs6-x86/info",
"apps/powerpoint/info",
"apps/powerpoint-o365-x86/info",
"apps/powerpoint-x86/info",
"apps/powershell/info",
"apps/publisher/info",
"apps/publisher-o365-x86/info",
"apps/publisher-x86/info",
"apps/word/info",
"apps/word-o365-x86/info",
"apps/word-x86/info",
"apps/access-o365/info",
"apps/excel-o365/info",
"apps/onenote-o365/info",
"apps/outlook-o365/info",
"apps/powerpoint-o365/info",
"apps/publisher-o365/info",
"apps/word-o365/info",
"install/inquirer.sh",
"oem/RDPApps.reg"
],
"license": false,
"force_author": false,
"force_license": true,
"custom_license": "SPDX-License-Identifier: AGPL-3.0-or-later"
}

View File

@@ -1,7 +1,6 @@
ci:
autoupdate_branch: "rewrite"
exclude: ^(.+)\.patch$
skip: [license-tools]
repos:
- repo: https://github.com/Lucas-C/pre-commit-hooks
@@ -50,3 +49,8 @@ repos:
rev: v0.10.0.1
hooks:
- id: shellcheck
- repo: https://github.com/emzeat/mz-lictools
rev: v2.7.0
hooks:
- id: license-tools

View File

@@ -3,6 +3,9 @@
Thank you for contributing to winapps! Before you can contribute, we ask some things of you:
- Please follow our Code of Conduct, the Contributor Covenant. You can find a copy in this repository or under https://www.contributor-covenant.org/
- All Contributors have to sign [a CLA](https://gist.github.com/oskardotglobal/35f0a72eb45fcc7087e535561383dbc5) for legal reasons. When opening a PR, @cla-assistant will prompt you and guide you through the process. However, if you contribute on behalf of a legal entity, we ask of you to sign [a different CLA](https://gist.github.com/oskardotglobal/75a8cc056e56a439fa6a1551129ae47f). In that case, please contact us.
- All Contributors have to sign [a CLA](https://gist.github.com/oskardotglobal/35f0a72eb45fcc7087e535561383dbc5) for legal reasons. When opening a PR, @cla-assitant will prompt you and guide you through the process. However, if you contribute on behalf of a legal entity, we ask of you to sign [a different CLA](https://gist.github.com/oskardotglobal/75a8cc056e56a439fa6a1551129ae47f). In that case, please contact us.
- Please follow code conventions enforced by `pre-commit`. To keep down CI usage, please run it locally before committing too.
See <https://pre-commit.com> for installation, then run `pre-commit install` inside the `winapps` repository you cloned.
All source code files shall have a valid SPDX-Identifier. For more information, see <https://spdx.dev/learn/handling-license-info/>.
This identifier will be generated by a pre-commit hook most of the time.

View File

@@ -1,8 +0,0 @@
Some of the files are
Copyright (c) 2024 fmstrat
Many files also contain contributions from third parties.
In this case the original copyright of the contributions can be traced through the history of the source version control system.
When that is not the case, the files contain a prominent notice stating the original copyright and applicable license, or come with their own dedicated COPYRIGHT and/or LICENSE file.

View File

@@ -1,5 +1,3 @@
For copyright information, please see the [COPYRIGHT.md](./COPYRIGHT.md) file.
This project has files licensed under different licenses.
The original project by Fmstrat <https://github.com/Fmstrat/winapps/> is not free software.

271
README.md
View File

@@ -1,5 +1,5 @@
<p align="center"><img align="center" width="700" src="./icons/banner_dark.svg#gh-dark-mode-only"/></p>
<p align="center"><img align="center" width="700" src="./icons/banner_light.svg#gh-light-mode-only"/></p>
<p align="center"><img align="center" width="700" src="./icons/banner_dark.svg#gh-light-mode-only"/></p>
<hr>
Run Windows applications (including [Microsoft 365](https://www.microsoft365.com/) and [Adobe Creative Cloud](https://www.adobe.com/creativecloud.html)) on GNU/Linux with `KDE Plasma`, `GNOME` or `XFCE`, integrated seamlessly as if they were native to the OS.
@@ -17,7 +17,6 @@ WinApps works by:
- The GNU/Linux `/home` directory is accessible within Windows via the `\\tsclient\home` mount.
- Integration with `Nautilus`, allowing you to right-click files to open them with specific Windows applications based on the file MIME type.
- The [official taskbar widget](https://github.com/winapps-org/WinApps-Launcher) enables seamless administration of the Windows subsystem and offers an easy way to launch Windows applications.
- Microsoft Office links (e.g. ms-word://) from the host system are automatically opened in the Windows subsystem. (Note: You may need to use an [User Agent switcher](https://github.com/ray-lothian/UserAgent-Switcher/) Browser Extension and set the User-Agent to Windows, as as the Office webapps typically hide the "Open in Desktop App" option for Linux users.)
## Supported Applications
**WinApps supports <u>*ALL*</u> Windows applications.**
@@ -121,7 +120,7 @@ Contributing to the list of supported applications is encouraged through submiss
</td>
<td>
<b>Adobe Photoshop</b><br>
(CS6, CC, 2022)<br>
(CS6, CC)<br>
<i><a href="https://commons.wikimedia.org/wiki/File:Adobe_Photoshop_CC_icon.svg">Icon</a> in the Public Domain.</i>
</td>
<!-- Command Prompt -->
@@ -255,14 +254,6 @@ Contributing to the list of supported applications is encouraged through submiss
</td>
</tr>
<tr>
<!-- mIRC -->
<td>
<img src="apps/mirc/icon.svg" width="100">
</td>
<td>
<b>mIRC</b><br>
<i><a href="https://en.wikipedia.org/wiki/MIRC#/media/File:Mircnewlogo.png">Icon</a> in the Public Domain.</i>
</td>
<!-- PowerShell -->
<td>
<img src="apps/powershell/icon.svg" width="100">
@@ -271,8 +262,6 @@ Contributing to the list of supported applications is encouraged through submiss
<b>PowerShell</b><br>
<i><a href="https://iconduck.com/icons/102322/file-type-powershell">Icon</a> under <a href="https://iconduck.com/licenses/mit">MIT license</a>.</i>
</td>
</tr>
<tr>
<!-- Windows -->
<td>
<img src="icons/windows.svg" width="100">
@@ -293,43 +282,35 @@ The following guides are available:
- [Creating a Windows VM with `Docker` or `Podman`](docs/docker.md)
- [Creating a Windows VM with `libvirt`](docs/libvirt.md)
If you already have a Windows VM or server you wish to use with WinApps, you will still have to follow the [final steps described in the `libvirt` documentation](docs/libvirt.md#final-configuration-steps).
If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry manually.
### Step 2: Install Dependencies
Install the required dependencies.
- Debian/Ubuntu:
```bash
sudo apt install -y curl dialog freerdp3-x11 git iproute2 libnotify-bin netcat-openbsd
sudo apt install -y dialog freerdp3-x11 iproute2 libnotify-bin netcat
```
> [!NOTE]
> On Debian you need to enable the `backports` repository for the `freerdp3-x11` package to become available.
> For instructions, see https://backports.debian.org/Instructions.
- Fedora/RHEL:
```bash
sudo dnf install -y curl dialog freerdp git iproute libnotify nmap-ncat
sudo dnf install -y dialog freerdp iproute libnotify nmap-ncat
```
- Arch Linux:
```bash
sudo pacman -Syu --needed -y curl dialog freerdp git iproute2 libnotify gnu-netcat
```
- OpenSUSE:
```bash
sudo zypper install -y curl dialog freerdp git iproute2 libnotify-tools netcat-openbsd
sudo pacman -Syu --needed -y dialog freerdp iproute2 libnotify
gnu-netcat
```
- Gentoo Linux:
```bash
sudo emerge --ask=n net-misc/curl dev-util/dialog net-misc/freerdp:3 dev-vcs/git sys-apps/iproute2 x11-libs/libnotify net-analyzer/openbsd-netcat
sudo emerge --ask=n sys-libs/dialog net-misc/freerdp:3 net-misc/iproute2 x11-libs/libnotify net-analyzer/netcat
```
> [!NOTE]
> WinApps requires `FreeRDP` version 3 or later. If not available for your distribution through your package manager, you can install the [Flatpak](https://flathub.org/apps/com.freerdp.FreeRDP):
> ```bash
> flatpak install flathub com.freerdp.FreeRDP
> sudo flatpak override --filesystem=home com.freerdp.FreeRDP # To use `+home-drive`
> ```
> However, if you have weird issues like [#233](https://github.com/winapps-org/winapps/issues/233) when running Flatpak, please compile FreeRDP from source according to [this guide](https://github.com/FreeRDP/FreeRDP/wiki/Compilation).
> WinApps requires `FreeRDP` version 3 or later. If not available for your distribution through your package manager, you can install the [Flatpak](https://flathub.org/apps/com.freerdp.FreeRDP).
```bash
flatpak install flathub com.freerdp.FreeRDP
sudo flatpak override --filesystem=home com.freerdp.FreeRDP # To use `+home-drive`
```
### Step 3: Create a WinApps Configuration File
Create a configuration file at `~/.config/winapps/winapps.conf` containing the following:
@@ -348,8 +329,6 @@ Create a configuration file at `~/.config/winapps/winapps.conf` containing the f
RDP_USER="MyWindowsUser"
# [WINDOWS PASSWORD]
# NOTES:
# - If using FreeRDP v3.9.0 or greater, you *have* to set a password
RDP_PASS="MyWindowsPassword"
# [WINDOWS DOMAIN]
@@ -363,14 +342,7 @@ RDP_DOMAIN=""
# - 'docker': '127.0.0.1'
# - 'podman': '127.0.0.1'
# - 'libvirt': '' (BLANK)
RDP_IP="127.0.0.1"
# [VM NAME]
# NOTES:
# - Only applicable when using 'libvirt'
# - The libvirt VM name must match so that WinApps can determine VM IP, start the VM, etc.
# DEFAULT VALUE: 'RDPWindows'
VM_NAME="RDPWindows"
RDP_IP=""
# [WINAPPS BACKEND]
# DEFAULT VALUE: 'docker'
@@ -392,18 +364,7 @@ WAFLAVOR="docker"
# - '180'
RDP_SCALE="100"
# [MOUNTING REMOVABLE PATHS FOR FILES]
# NOTES:
# - By default, `udisks` (which you most likely have installed) uses /run/media for mounting removable devices.
# This improves compatibility with most desktop environments (DEs).
# ATTENTION: The Filesystem Hierarchy Standard (FHS) recommends /media instead. Verify your system's configuration.
# - To manually mount devices, you may optionally use /mnt.
# REFERRENCE: https://wiki.archlinux.org/title/Udisks#Mount_to_/media
REMOVABLE_MEDIA="/run/media"
# [ADDITIONAL FREERDP FLAGS & ARGUMENTS]
# NOTES:
# - You can try adding /network:lan to these flags in order to increase performance, however, some users have faced issues with this.
# DEFAULT VALUE: '/cert:tofu /sound /microphone'
# VALID VALUES: See https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown
RDP_FLAGS="/cert:tofu /sound /microphone"
@@ -453,37 +414,12 @@ AUTOPAUSE_TIME="300"
# DEFAULT VALUE: '' (BLANK)
# VALID VALUES: The command required to run FreeRDPv3 on your system (e.g., 'xfreerdp', 'xfreerdp3', etc.).
FREERDP_COMMAND=""
# [TIMEOUTS]
# NOTES:
# - These settings control various timeout durations within the WinApps setup.
# - Increasing the timeouts is only necessary if the corresponding errors occur.
# - Ensure you have followed all the Troubleshooting Tips in the error message first.
# PORT CHECK
# - The maximum time (in seconds) to wait when checking if the RDP port on Windows is open.
# - Corresponding error: "NETWORK CONFIGURATION ERROR" (exit status 13).
# DEFAULT VALUE: '5'
PORT_TIMEOUT="5"
# RDP CONNECTION TEST
# - The maximum time (in seconds) to wait when testing the initial RDP connection to Windows.
# - Corresponding error: "REMOTE DESKTOP PROTOCOL FAILURE" (exit status 14).
# DEFAULT VALUE: '30'
RDP_TIMEOUT="30"
# APPLICATION SCAN
# - The maximum time (in seconds) to wait for the script that scans for installed applications on Windows to complete.
# - Corresponding error: "APPLICATION QUERY FAILURE" (exit status 15).
# DEFAULT VALUE: '60'
APP_SCAN_TIMEOUT="60"
```
> [!IMPORTANT]
> [!NOTE]
> `RDP_USER` and `RDP_PASS` must correspond to a complete Windows user account and password, such as those created during Windows setup or for a domain user. User/PIN combinations are not valid for RDP access.
> [!IMPORTANT]
> [!NOTE]
> If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`.
#### Configuration Options Explained
@@ -496,65 +432,13 @@ APP_SCAN_TIMEOUT="60"
- If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log`.
- If using a system on which the FreeRDP command is not `xfreerdp` or `xfreerdp3`, the correct command can be specified using `FREERDP_COMMAND`.
### Step 4: Test FreeRDP
1. Test establishing an RDP session by running the following command, replacing the `/u:`, `/p:`, and `/v:` values with the correct values specified in `~/.config/winapps/winapps.conf`.
```bash
xfreerdp3 /u:"Your Windows Username" /p:"Your Windows Password" /v:192.168.122.2 /cert:tofu
# Or, if you installed FreeRDP using Flatpak
flatpak run --command=xfreerdp com.freerdp.FreeRDP /u:"Your Windows Username" /p:"Your Windows Password" /v:192.168.122.2 /cert:tofu
```
- Please note that the correct `FreeRDP` command may vary depending on your system (e.g. `xfreerdp`, `xfreerdp3`, etc.).
- Ensure you use the correct IP address for your Windows instance in the above command.
- If prompted within the terminal window, choose to accept the certificate permanently.
If the Windows desktop appears in a `FreeRDP` window, the configuration was successful and the correct RDP TLS certificate was enrolled on the Linux host. Disconnect from the RDP session and skip the following debugging step.
2. [DEBUGGING STEP] If an outdated or expired certificate is detected, the `FreeRDP` command will display output resembling the following. In this case, the old certificate will need to be removed and a new RDP TLS certificate installed.
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: CERTIFICATE NAME MISMATCH! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The hostname used for this connection (192.168.122.2:3389)
does not match the name given in the certificate:
Common Name (CN):
RDPWindows
A valid certificate for the wrong name should NOT be trusted!
The host key for 192.168.122.2:3389 has changed
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the host key sent by the remote host is 8e:b4:d2:8e:4e:14:e7:4e:82:9b:07:5b:e1:68:40:18:bc:db:5f:bc:29:0d:91:83:f9:17:f9:13:e6:51:dc:36
Please contact your system administrator.
Add correct host key in /home/rohanbarar/.config/freerdp/server/192.168.122.2_3389.pem to get rid of this message.
```
If you experience the above error, delete any old or outdated RDP TLS certificates associated with Windows, as they can prevent `FreeRDP` from establishing a connection.
These certificates are located within `~/.config/freerdp/server/` and follow the naming format `<Windows-VM-IPv4-Address>_<RDP-Port>.pem` (e.g., `192.168.122.2_3389.pem`, `127.0.0.1_3389.pem`, etc.).
If you use FreeRDP for purposes other than WinApps, ensure you only remove certificates related to the relevant Windows VM. If no relevant certificates are found, no action is needed.
Following deletion, re-attempt establishing an RDP session.
### Step 5: Run the WinApps Installer
With Windows still powered on, run the WinApps installer.
### Step 4: Run the WinApps Installer
Run the WinApps installer.
```bash
bash <(curl https://raw.githubusercontent.com/winapps-org/winapps/main/setup.sh)
```
Once WinApps is installed, a list of additional arguments can be accessed by running `winapps-setup --help`.
A list of supported additional arguments can be accessed by running `./setup.sh --help`.
<img src="./demo/installer.gif" width=1000 alt="WinApps Installer Animation.">
@@ -579,121 +463,6 @@ The installer can be run multiple times. To update your installation of WinApps:
2. Pull the latest changes from the WinApps GitHub repository.
3. Re-install WinApps using the WinApps installer by running `winapps-setup`.
## Installation using Nix
First, follow Step 1 of the normal installation guide to create your VM.
Then, install WinApps according to the following instructions.
After installation, it will be available under `winapps`, with the installer being available under `winapps-setup`
and the optional launcher being available under `winapps-launcher.`
### Using standalone Nix
First, make sure Flakes and the `nix` command are enabled.
In your `~/.config/nix/nix.conf`:
```
experimental-features = nix-command flakes
# specify to use binary cache (optional)
extra-substituters = https://winapps.cachix.org/
extra-trusted-public-keys = winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g=
extra-trusted-users = <your-username> # replace with your username
```
```bash
nix profile install github:winapps-org/winapps#winapps
nix profile install github:winapps-org/winapps#winapps-launcher # optional
```
### On NixOS using Flakes
```nix
# flake.nix
{
description = "My configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
winapps = {
url = "github:winapps-org/winapps";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
inputs@{
nixpkgs,
winapps,
...
}:
{
nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = {
inherit inputs system;
};
modules = [
./configuration.nix
(
{
pkgs,
system ? pkgs.system,
...
}:
{
# set up binary cache (optional)
nix.settings = {
substituters = [ "https://winapps.cachix.org/" ];
trusted-public-keys = [ "winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g=" ];
};
environment.systemPackages = [
winapps.packages."${system}".winapps
winapps.packages."${system}".winapps-launcher # optional
];
}
)
];
};
};
}
```
### On NixOS without Flakes
[Flakes aren't real and they can't hurt you.](https://jade.fyi/blog/flakes-arent-real/).
However, if you still don't want to use flakes, you can use WinApps with flake-compat like:
```nix
# configuration.nix
{
pkgs,
system ? pkgs.system,
...
}:
{
# set up binary cache (optional)
nix.settings = {
substituters = [ "https://winapps.cachix.org/" ];
trusted-public-keys = [ "winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g=" ];
trusted-users = [ "<your username>" ]; # replace with your username
};
environment.systemPackages =
let
winapps =
(import (builtins.fetchTarball "https://github.com/winapps-org/winapps/archive/main.tar.gz"))
.packages."${system}";
in
[
winapps.winapps
winapps.winapps-launcher # optional
];
}
```
## Star History
<a href="https://star-history.com/#winapps-org/winapps&Date">
<picture>

View File

@@ -1,3 +1,8 @@
# Copyright (c) 2024 Fmstrat
# All rights reserved.
#
# SPDX-License-Identifier: Proprietary
# GNOME shortcut name
NAME="Access"

View File

@@ -1,3 +1,8 @@
# Copyright (c) 2024 Fmstrat
# All rights reserved.
#
# SPDX-License-Identifier: Proprietary
# GNOME shortcut name
NAME="Access"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Adam
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Acrobat 9"

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -1,17 +0,0 @@
# GNOME shortcut name
NAME="DYMO Connect"
# Used for descriptions and window class
FULL_NAME="Software for DYMO label printers"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\DYMO\DYMO Connect\DYMOConnect.exe"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES=""
# System Icon
ICON="DYMOConnect"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Adam
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Excel"

View File

@@ -1 +0,0 @@
<svg height="512" width="485" xmlns="http://www.w3.org/2000/svg"><path d="m70.9856796.099867 147.1711121 21.1684494c4.9958038.7186089 9.4206696 3.6028881 12.0942841 7.8835335l186.6232452 298.7956543 57.4749451 24.1019287c7.645813 3.2071838 11.9003601 11.4268799 10.1008911 19.5205688l-28.2246018 127.0107173c-1.741394 7.8406982-8.6961365 13.419281-16.7278442 13.419281h-99.7940979c-7.125061 0-13.5059204-4.4081116-16.026947-11.0715027l-64.8904114-171.496521-33.5339355 10.1796265-70.4281006 162.0817871c-2.7193909 6.257782-8.8930359 10.3066101-15.7168732 10.3066101h-96.77005c-7.6413727 0-14.3593845-5.0597839-16.4699287-12.4033813l-25.2005348-87.697876c-1.6572304-5.7675781-.1771913-11.9810791 3.9016533-16.3813171l182.9347229-197.3772888-20.0501709-34.7536011-57.9149628-11.582901c-5.8025284-1.1605988-10.5960388-5.2325439-12.6790237-10.7717438l-44.3529436-117.9385052c-3.7618599-11.4255447 3.7893296-24.361076 18.4795723-22.9935187zm280.5562821 477.6273974h74.2096558l22.1351318-99.6100159-49.2886963-20.6693725c-3.268219-1.3702698-6.030426-3.7200317-7.9076538-6.7254028l-185.2913666-296.663929-110.6150894-15.9103012 30.805191 81.9140472 56.1917801 11.2383575c4.8348541.9671631 9.0185394 3.969574 11.4824829 8.2403717l30.2406464 52.4171143c3.7544861 6.5073547 2.8321075 14.7019501-2.2749481 20.2121124l-184.9527245 199.5542717 18.9663582 66.0027466h72.6262665l69.107048-159.0409546c2.0032501-4.6099243 5.9295197-8.1074829 10.7392731-9.5673523l56.4487152-17.1363525c8.6380615-2.6244202 17.8136292 1.8988953 21.0050354 10.3322144z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,14 +0,0 @@
# GNOME shortcut name
NAME="LINQPad8"
# Used for descriptions and window class
FULL_NAME="LINQPad 8"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\LINQPad8\LINQPad8.exe"
# GNOME categories
CATEGORIES="WinApps;Development"
# GNOME mimetypes
MIME_TYPES="text/cs"

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -1,22 +0,0 @@
# Copyright (c) 2024 Fmstrat | App tested by whitewolf101 02/22/2025
# All rights reserved.
#
# SPDX-License-Identifier: Proprietary
# GNOME shortcut name
NAME="mIRC"
# Used for descriptions and window class
FULL_NAME="mIRC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\mIRC\mirc.exe"
# GNOME categories
CATEGORIES="WinApps;Network;IRCclient;"
# GNOME mimetypes
MIME_TYPES=""
# System Icon
ICON="mIRC"

View File

@@ -1,9 +0,0 @@
[Desktop Entry]
Name=Microsoft Office Protocol Handler
Comment=Handle Microsoft Office URI schemes via WinApps
Exec=winapps manual %u
Terminal=false
Type=Application
MimeType=x-scheme-handler/ms-word;x-scheme-handler/ms-excel;x-scheme-handler/ms-powerpoint;x-scheme-handler/ms-outlook;x-scheme-handler/ms-access;x-scheme-handler/ms-visio;x-scheme-handler/ms-project;x-scheme-handler/ms-teams;x-scheme-handler/ms-whiteboard;x-scheme-handler/ms-officeapp;
NoDisplay=true
Categories=Office;Utility;

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Adam
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Paint"

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 240 234" style="enable-background:new 0 0 240 234;" xml:space="preserve">
<style type="text/css">
.st0{fill:#001E36;}
.st1{fill:#31A8FF;}
</style>
<g id="Layer_2_1_">
<g id="Surfaces">
<g id="Photo_Surface">
<g id="Outline_no_shadow">
<path class="st0" d="M42.5,0h155C221,0,240,19,240,42.5v149c0,23.5-19,42.5-42.5,42.5h-155C19,234,0,215,0,191.5v-149
C0,19,19,0,42.5,0z"/>
</g>
</g>
</g>
<g id="Outlined_Mnemonics_Logos">
<g id="Ps">
<path class="st1" d="M54,164.1V61.2c0-0.7,0.3-1.1,1-1.1c1.7,0,3.3,0,5.6-0.1c2.4-0.1,4.9-0.1,7.6-0.2c2.7-0.1,5.6-0.1,8.7-0.2
c3.1-0.1,6.1-0.1,9.1-0.1c8.2,0,15,1,20.6,3.1c5,1.7,9.6,4.5,13.4,8.2c3.2,3.2,5.7,7.1,7.3,11.4c1.5,4.2,2.3,8.5,2.3,13
c0,8.6-2,15.7-6,21.3c-4,5.6-9.6,9.8-16.1,12.2c-6.8,2.5-14.3,3.4-22.5,3.4c-2.4,0-4,0-5-0.1c-1-0.1-2.4-0.1-4.3-0.1v32.1
c0.1,0.7-0.4,1.3-1.1,1.4c-0.1,0-0.2,0-0.4,0H55.2C54.4,165.4,54,165,54,164.1z M75.8,79.4V113c1.4,0.1,2.7,0.2,3.9,0.2H85
c3.9,0,7.8-0.6,11.5-1.8c3.2-0.9,6-2.8,8.2-5.3c2.1-2.5,3.1-5.9,3.1-10.3c0.1-3.1-0.7-6.2-2.3-8.9c-1.7-2.6-4.1-4.6-7-5.7
c-3.7-1.5-7.7-2.1-11.8-2c-2.6,0-4.9,0-6.8,0.1C77.9,79.2,76.5,79.3,75.8,79.4L75.8,79.4z"/>
<path class="st1" d="M192,106.9c-3-1.6-6.2-2.7-9.6-3.4c-3.7-0.8-7.4-1.3-11.2-1.3c-2-0.1-4.1,0.2-6,0.7c-1.3,0.3-2.4,1-3.1,2
c-0.5,0.8-0.8,1.8-0.8,2.7c0,0.9,0.4,1.8,1,2.6c0.9,1.1,2.1,2,3.4,2.7c2.3,1.2,4.7,2.3,7.1,3.3c5.4,1.8,10.6,4.3,15.4,7.3
c3.3,2.1,6,4.9,7.9,8.3c1.6,3.2,2.4,6.7,2.3,10.3c0.1,4.7-1.3,9.4-3.9,13.3c-2.8,4-6.7,7.1-11.2,8.9c-4.9,2.1-10.9,3.2-18.1,3.2
c-4.6,0-9.1-0.4-13.6-1.3c-3.5-0.6-7-1.7-10.2-3.2c-0.7-0.4-1.2-1.1-1.1-1.9v-17.4c0-0.3,0.1-0.7,0.4-0.9
c0.3-0.2,0.6-0.1,0.9,0.1c3.9,2.3,8,3.9,12.4,4.9c3.8,1,7.8,1.5,11.8,1.5c3.8,0,6.5-0.5,8.3-1.4c1.6-0.7,2.7-2.4,2.7-4.2
c0-1.4-0.8-2.7-2.4-4c-1.6-1.3-4.9-2.8-9.8-4.7c-5.1-1.8-9.8-4.2-14.2-7.2c-3.1-2.2-5.7-5.1-7.6-8.5c-1.6-3.2-2.4-6.7-2.3-10.2
c0-4.3,1.2-8.4,3.4-12.1c2.5-4,6.2-7.2,10.5-9.2c4.7-2.4,10.6-3.5,17.7-3.5c4.1,0,8.3,0.3,12.4,0.9c3,0.4,5.9,1.2,8.6,2.3
c0.4,0.1,0.8,0.5,1,0.9c0.1,0.4,0.2,0.8,0.2,1.2v16.3c0,0.4-0.2,0.8-0.5,1C192.9,107.1,192.4,107.1,192,106.9z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,17 +0,0 @@
# GNOME shortcut name
NAME="Photoshop 2022"
# Used for descriptions and window class
FULL_NAME="Adobe Photoshop 2022"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop 2022\Photoshop.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
# System Icon
ICON="AdobePhotoshop"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Adam
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Powershell"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Project"
# Used for descriptions and window class

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Project"

View File

@@ -1,97 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Livello_1"
x="0px"
y="0px"
viewBox="0 0 1881.25 1750"
enable-background="new 0 0 1881.25 1750"
xml:space="preserve"
sodipodi:docname="icon.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns="&amp;ns_sfw;"><defs
id="defs34" /><sodipodi:namedview
id="namedview32"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.58685714"
inkscape:cx="940.6037"
inkscape:cy="800.02434"
inkscape:window-width="2494"
inkscape:window-height="1371"
inkscape:window-x="66"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="Livello_1" />
<metadata
id="metadata2">
<ns:sfw>
<ns:slices />
<ns:sliceSourceBounds
bottomLeftOrigin="true"
height="1750"
width="1881.25"
x="-938.5"
y="-851" />
</ns:sfw>
</metadata>
<linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="167.2057"
y1="1420.9117"
x2="795.2943"
y2="333.0883"
gradientTransform="matrix(1 0 0 -1 0 1752)">
<stop
offset="0"
style="stop-color:#2368C4"
id="stop20" />
<stop
offset="0.5"
style="stop-color:#1A5DBE"
id="stop22" />
<stop
offset="1"
style="stop-color:#1146AC"
id="stop24" />
</linearGradient>
<rect
style="fill:#fff6d5"
id="rect399"
width="1881.25"
height="1750"
x="0"
y="0"
ry="134.62839" /><text
xml:space="preserve"
style="font-size:1066.67px;fill:#000000;-inkscape-font-specification:serif;font-family:serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal"
x="204.01395"
y="1266.3248"
id="text295"><tspan
sodipodi:role="line"
id="tspan293"
x="204.01395"
y="1266.3248">rM</tspan></text></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,17 +0,0 @@
# GNOME shortcut name
NAME="reMarkable"
# Used for descriptions and window class
FULL_NAME="reMarkable Desktop App"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\reMarkable\reMarkable.exe"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES=""
# System Icon
ICON="reMarkable"

View File

@@ -1,61 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="200px" height="200px" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" viewBox="0 0 8.53 8.53" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
<![CDATA[
.fil0 {fill:none}
.fil7 {fill:#007400}
.fil6 {fill:#017901}
.fil5 {fill:#107B10}
.fil3 {fill:#3C3C41}
.fil12 {fill:#439043}
.fil10 {fill:#5EA05E}
.fil8 {fill:#6EA76E}
.fil9 {fill:#78AC78}
.fil11 {fill:#94BC94}
.fil13 {fill:#B9B9BB}
.fil2 {fill:#D2D2D2}
.fil1 {fill:#FEB900}
.fil4 {fill:#FFDC80}
]]>
</style>
</defs>
<g id="Layer_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<g id="_2075241592848">
<rect class="fil0" width="8.53" height="8.53"/>
<g>
<path class="fil1" d="M1.74 1.57c0.26,-0.2 0.37,-0.27 0.77,-0.35 1.81,-0.4 3.75,0.46 1.87,0.85 -0.64,0.13 -1.36,0.13 -1.99,-0.03 -0.24,-0.07 -0.65,-0.17 -0.65,-0.47zm1.92 2.92l0.13 0.11c0.07,-0.07 0.03,0.02 0.05,-0.12 0,-0.01 0,-0.11 0,-0.12l0 -1.95c0.18,-0.04 0.39,-0.04 0.58,-0.08 0.16,-0.04 0.38,-0.13 0.51,-0.14l-0.01 1.9c0.32,0.1 0.4,0.44 0.49,0.55 0.03,-0.74 0.01,-2.1 0,-2.94 0,-0.32 -0.18,-0.45 -0.42,-0.57 -0.81,-0.38 -2.52,-0.39 -3.24,0.09 -0.24,0.17 -0.28,0.3 -0.28,0.67l0 2.96c0,0.38 0.08,0.5 0.32,0.65 0.19,0.11 0.48,0.2 0.74,0.26 0.59,0.12 1.2,0.11 1.82,0 -0.58,-0.26 -0.85,-0.46 -0.69,-1.27z"/>
<path class="fil2" d="M1.74 1.57c0,0.3 0.41,0.4 0.65,0.47 0.63,0.16 1.35,0.16 1.99,0.03 1.88,-0.39 -0.06,-1.25 -1.87,-0.85 -0.4,0.08 -0.51,0.15 -0.77,0.35z"/>
<path class="fil3" d="M5.81 6.23c0.25,-0.15 0.23,-0.41 0.33,-0.52 0.08,-0.1 0.14,-0.09 0.3,-0.14 0.15,-0.05 1.03,-0.96 1.06,-1.04l-0.61 -0.53c-0.19,0.29 -0.58,0.59 -0.83,0.83 -0.2,0.18 -0.15,0.11 -0.18,0.26 -0.08,0.39 -0.3,0.29 -0.45,0.37 -0.08,0.05 -0.13,0.14 -0.21,0.19 0.07,0.09 0.12,0.11 0.2,0.21 -0.07,0.07 -0.12,0.15 -0.2,0.22 -0.2,0.19 -0.48,0.41 -0.63,0.6 -0.3,0.38 -0.15,-0.12 -0.63,0.6 -0.13,0.2 -0.13,0.19 -0.09,0.24 0.09,0.09 0.16,0 0.28,-0.08 0.27,-0.18 0.3,-0.12 0.43,-0.38 0.04,-0.08 0.09,-0.12 0.17,-0.19l0.4 -0.43c0.13,-0.13 0.28,-0.32 0.44,-0.41l0.22 0.2z"/>
<path class="fil4" d="M3.79 4.6c0.37,0.3 0.25,0.5 0.75,0.31l0.1 -0.31c-0.15,-0.25 -0.39,-0.36 -0.53,-0.56 0.24,-0.04 0.6,-0.13 0.81,0.05l0.01 -1.9c-0.13,0.01 -0.35,0.1 -0.51,0.14 -0.19,0.04 -0.4,0.04 -0.58,0.08l0 1.95c0,0.01 0,0.11 0,0.12 -0.02,0.14 0.02,0.05 -0.05,0.12z"/>
<path class="fil3" d="M4.31 4.15l0.44 0.39 -0.13 0.45 -0.45 0.1 -0.46 -0.42c-0.08,0.47 0.15,0.78 0.46,0.92 0.27,0.11 0.52,0.02 0.6,0.05 0.11,0.05 0.23,0.25 0.36,0.31l0.09 -0.07c-0.05,-0.12 -0.11,-0.14 -0.19,-0.23 0.04,-0.07 0.03,-0.06 0.09,-0.13l0.24 -0.2c0.14,-0.07 0.08,0.03 0.11,-0.04 0,0 0.01,0 0.02,0 -0.16,-0.23 -0.2,-0.09 -0.18,-0.37 0.04,-0.57 -0.39,-0.83 -0.95,-0.84 -0.06,0.03 -0.01,0 -0.05,0.08z"/>
<path class="fil3" d="M5.84 6.42c-0.17,-0.08 -0.23,-0.27 -0.3,-0.14 -0.03,0.04 -0.02,0 -0.01,0.07 0,0.04 0.05,0.08 0.08,0.11 0.3,0.27 0.76,0.69 1.02,0.98 0.22,0.25 0.7,0.13 0.69,-0.25 -0.01,-0.31 -0.67,-0.73 -1.1,-1.24 -0.01,0.01 -0.01,0.02 -0.02,0.02 -0.11,0.23 -0.1,0.17 -0.36,0.45z"/>
<polygon class="fil5" points="0.85,7.67 1.09,7.67 1.1,7.42 0.84,7.42 "/>
<polygon class="fil5" points="7.43,1.1 7.68,1.1 7.68,0.85 7.44,0.85 "/>
<polygon class="fil5" points="0.84,6.82 1.07,6.83 1.07,6.57 0.84,6.57 "/>
<polygon class="fil5" points="7.45,2.39 7.59,2.38 7.68,2.38 7.68,2.26 7.68,2.13 7.45,2.13 "/>
<polygon class="fil5" points="0.84,7.25 1.07,7.25 1.07,7 0.84,7 "/>
<polygon class="fil5" points="7.45,1.53 7.5,1.53 7.68,1.53 7.68,1.4 7.68,1.27 7.45,1.27 "/>
<polygon class="fil5" points="0.84,6.4 1.07,6.4 1.07,6.14 0.85,6.14 "/>
<polygon class="fil5" points="7.45,1.96 7.68,1.96 7.68,1.83 7.68,1.7 7.45,1.7 "/>
<polygon class="fil5" points="1.28,7.67 1.52,7.67 1.51,7.45 1.27,7.45 "/>
<path class="fil6" d="M7.22 0.91l0 0.12 -0.19 0 0 -0.12 0.19 0zm-0.22 0.17l0.26 0 -0.01 -0.23 -0.24 0 -0.01 0.23z"/>
<path class="fil6" d="M1.89 7.49l0 0.13 -0.15 0 0 -0.13 0.15 0zm-0.2 0.17l0.24 0 0.01 -0.19 -0.24 0 -0.01 0.19z"/>
<path class="fil6" d="M2.17 7.49l0.15 0 0 0.13 -0.15 0 0 -0.13zm-0.03 0.17l0.21 0 0 -0.2 -0.21 0.01 0 0.19z"/>
<path class="fil6" d="M6.79 0.91l0 0.12 -0.16 0 0 -0.12 0.16 0zm-0.19 0.15l0.22 0 -0.01 -0.19 -0.21 0.01 0 0.18z"/>
<polygon class="fil5" points="7.03,1.03 7.22,1.03 7.22,0.91 7.03,0.91 "/>
<path class="fil7" d="M6.36 0.9l0 0.13 -0.16 0 0 -0.13 0.16 0zm-0.19 0.16l0.22 0 -0.01 -0.2 -0.21 0 0 0.2z"/>
<path class="fil8" d="M2.14 7.47l0.21 -0.01 0 0.2 -0.21 0 0 -0.19zm-0.03 0.22l0.27 -0.02 -0.01 -0.23 -0.26 0 0 0.25z"/>
<path class="fil9" d="M6.17 0.86l0.21 0 0.01 0.2 -0.22 0 0 -0.2zm-0.02 0.22l0.26 0.01 0.01 -0.24 -0.27 -0.01 0 0.24z"/>
<polygon class="fil5" points="6.2,1.03 6.36,1.03 6.36,0.9 6.2,0.9 "/>
<polygon class="fil5" points="2.32,7.62 2.32,7.49 2.17,7.49 2.17,7.62 "/>
<polygon class="fil5" points="1.74,7.62 1.89,7.62 1.89,7.49 1.74,7.49 "/>
<polygon class="fil5" points="6.63,1.03 6.79,1.03 6.79,0.91 6.63,0.91 "/>
<path class="fil10" d="M1.69 7.66c0.1,0.04 0.16,0.03 0.27,0.02l-0.01 -0.24c-0.16,0 -0.16,-0.02 -0.25,0.03l0.24 0 -0.01 0.19 -0.24 0z"/>
<path class="fil11" d="M6.6 1.06l-0.03 0c0.05,0.06 0.18,0.04 0.26,0.01 0.01,-0.04 0.02,-0.06 0.02,-0.1 -0.01,-0.14 0,-0.08 -0.04,-0.12l0 0.02 0.01 0.19 -0.22 0z"/>
<polygon class="fil12" points="6.57,1.06 6.6,1.06 6.6,0.88 6.81,0.87 6.81,0.85 6.58,0.85 "/>
<path class="fil13" d="M4.31 4.15c0.04,-0.08 -0.01,-0.05 0.05,-0.08l-0.06 0.01 0.01 0.07z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -1,14 +0,0 @@
# GNOME shortcut name
NAME="SQL Server Management Studio"
# Used for descriptions and window class
FULL_NAME="SQL Server Management Studio"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft SQL Server Management Studio 20\Common7\IDE\Ssms.exe"
# GNOME categories
CATEGORIES="Development"
# GNOME mimetypes
MIME_TYPES="text/sql"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Visio"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Visio"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Visual Studio Community"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Visual Studio Enterprise"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Gordon Cheong
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Visual Studio Professional"

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Adam
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# GNOME shortcut name
NAME="Word"

View File

@@ -1,4 +1,12 @@
#!/usr/bin/env bash
# Copyright (c) 2024 Felix Bartels
# Copyright (c) 2024 Rhea Barar
# Copyright (c) 2024 Rohan Barar
# Copyright (c) 2024 Oskar Manhart
# Copyright (c) 2024 escapefreeg
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
### GLOBAL CONSTANTS ###
# ERROR CODES
@@ -29,11 +37,12 @@ readonly COMPOSE_PATH="${HOME}/.config/winapps/compose.yaml"
readonly SCRIPT_DIR_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
# OTHER
readonly VM_NAME="RDPWindows" # FOR 'libvirt' ONLY
readonly CONTAINER_NAME="WinApps" # FOR 'docker' AND 'podman' ONLY
readonly RDP_PORT=3389
readonly DOCKER_IP="127.0.0.1"
# shellcheck disable=SC2155 # Silence warnings regarding masking return values through simultaneous declaration and assignment.
readonly RUNID="${RANDOM}"
readonly RUN="$(date)-${RANDOM}"
### GLOBAL VARIABLES ###
# WINAPPS CONFIGURATION FILE
@@ -41,11 +50,9 @@ RDP_USER=""
RDP_PASS=""
RDP_DOMAIN=""
RDP_IP=""
VM_NAME="RDPWindows" # FOR 'libvirt' ONLY
WAFLAVOR="docker"
RDP_FLAGS=""
FREERDP_COMMAND=""
REMOVABLE_MEDIA=""
RDP_SCALE=100
AUTOPAUSE="off"
AUTOPAUSE_TIME="300"
@@ -124,7 +131,7 @@ Please run:
;;
"$EC_NOT_EXIST")
dprint "ERROR: WINDOWS NONEXISTENT. EXITING."
notify-send --expire-time=8000 --icon="dialog-error" --app-name="WinApps" --urgency="low" "WinApps" "Windows VM named '${VM_NAME}' does not exist."
notify-send --expire-time=8000 --icon="dialog-error" --app-name="WinApps" --urgency="low" "WinApps" "Windows does not exist."
;;
"$EC_UNKNOWN")
dprint "ERROR: UNKNOWN CONTAINER ERROR. EXITING."
@@ -155,18 +162,9 @@ Please run:
# Name: 'dprint'
# Role: Conditionally print debug messages to a log file, creating it if it does not exist.
function dprint() {
[ "$DEBUG" = "true" ] && echo "[$(date)-$RUNID] $1" >>"$LOG_PATH"
}
# Name: 'waFixRemovableMedia'
# Role: If user left REMOVABLE_MEDIA config null,fallback to /run/media for udisks defaults ,warning.
function waFixRemovableMedia() {
if [ -z "$REMOVABLE_MEDIA" ]; then
REMOVABLE_MEDIA="/run/media" # Default for udisks
dprint "NOTICE: Using default REMOVABLE_MEDIA: $REMOVABLE_MEDIA"
notify-send --expire-time=3000 --icon="drive-removable-media" \
"WinApps Notice" "Using default removable media path: $REMOVABLE_MEDIA"
fi
[ "$DEBUG" = "true" ] && echo "[$RUN] $1" >>"$LOG_PATH"
}
# Name: 'waFixScale'
# Role: Since FreeRDP only supports '/scale' values of 100, 140 or 180, find the closest supported argument to the user's configuration.
function waFixScale() {
@@ -217,8 +215,7 @@ function waLoadConfig() {
# Update $RDP_SCALE.
waFixScale
# Update when $REMOVABLE_MEDIA is null
waFixRemovableMedia
# Update $AUTOPAUSE_TIME.
# RemoteApp RDP sessions take, at minimum, 20 seconds to be terminated by the Windows server.
# Hence, subtract 20 from the timeout specified by the user, as a 'built in' timeout of 20 seconds will occur.
@@ -592,8 +589,7 @@ function waRunCommand() {
else
# Convert path from UNIX to Windows style.
FILE_PATH=$(echo "$2" | sed \
-e 's|^'"${HOME}"'|\\\\tsclient\\home|' \
-e 's|^\('"${REMOVABLE_MEDIA//|/\\|}"'\)/[^/]*|\\\\tsclient\\media|' \
-e 's|'"${HOME}"'|\\\\tsclient\\home|' \
-e 's|/|\\|g')
dprint "UNIX_FILE_PATH: ${2}"
dprint "WINDOWS_FILE_PATH: ${FILE_PATH}"
@@ -607,7 +603,6 @@ function waRunCommand() {
+auto-reconnect \
+home-drive \
+clipboard \
/drive:media,"$REMOVABLE_MEDIA" \
-wallpaper \
"$MULTI_FLAG" \
/wm-class:"$FULL_NAME" \

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Oskar Manhart
# Copyright (c) 2024 Rohan Barar
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# For documentation, FAQ, additional configuration options and technical help, visit: https://github.com/dockur/windows
name: "winapps" # Docker Compose Project Name.
@@ -8,42 +14,34 @@ volumes:
data:
services:
windows:
image: ghcr.io/dockur/windows:latest
image: dockurr/windows # https://hub.docker.com/r/dockurr/windows
container_name: WinApps # Created Docker VM Name.
environment:
# Version of Windows to configure. For valid options, visit:
# https://github.com/dockur/windows?tab=readme-ov-file#how-do-i-select-the-windows-version
# https://github.com/dockur/windows?tab=readme-ov-file#how-do-i-install-a-custom-image
VERSION: "11"
VERSION: "tiny11"
RAM_SIZE: "4G" # RAM allocated to the Windows VM.
CPU_CORES: "4" # CPU cores allocated to the Windows VM.
DISK_SIZE: "64G" # Size of the primary hard disk.
# DISK2_SIZE: "32G" # Uncomment to add an additional hard disk to the Windows VM. Ensure it is mounted as a volume below.
USERNAME: "MyWindowsUser" # Edit here to set a custom Windows username. The default is 'MyWindowsUser'.
PASSWORD: "MyWindowsPassword" # Edit here to set a password for the Windows user. The default is 'MyWindowsPassword'.
#DISK2_SIZE: "32G" # Uncomment to add an additional hard disk to the Windows VM. Ensure it is mounted as a volume below.
#USERNAME: "Docker" # Uncomment to set a custom Windows username. The default is 'Docker'.
#PASSWORD: "" # Uncomment to set a password for the Windows user. There is no default password.
HOME: "${HOME}" # Set path to Linux user home folder.
privileged: true # Grant the Windows VM extended privileges.
ports:
- 8006:8006 # Map '8006' on Linux host to '8006' on Windows VM --> For VNC Web Interface @ http://127.0.0.1:8006.
- 3389:3389/tcp # Map '3389' on Linux host to '3389' on Windows VM --> For Remote Desktop Protocol (RDP).
- 3389:3389/udp # Map '3389' on Linux host to '3389' on Windows VM --> For Remote Desktop Protocol (RDP).
cap_add:
- NET_ADMIN # Add network permission
stop_grace_period: 120s # Wait 120 seconds before sending SIGTERM when attempting to shut down the Windows VM.
restart: on-failure # Restart the Windows VM if the exit code indicates an error.
volumes:
- data:/storage # Mount volume 'data' to use as Windows 'C:' drive.
- ${HOME}:/shared # Mount Linux user home directory @ '\\host.lan\Data'.
#- /path/to/second/hard/disk:/storage2 # Uncomment to create a virtual second hard disk and mount it within the Windows VM. Ensure 'DISK2_SIZE' is specified above.
#- /path/to/second/hard/disk:/storage2 # Uncomment to mount the second hard disk within the Windows VM. Ensure 'DISK2_SIZE' is specified above.
- ./oem:/oem # Enables automatic post-install execution of 'oem/install.bat', applying Windows registry modifications contained within 'oem/RDPApps.reg'.
#- /path/to/windows/install/media.iso:/custom.iso # Uncomment to use a custom Windows ISO. If specified, 'VERSION' (e.g. 'tiny11') will be ignored.
devices:
- /dev/kvm # Enable KVM.
- /dev/net/tun # Enable tuntap
# Uncomment to mount a disk directly within the Windows VM.
# WARNING: /dev/sdX paths may change after reboot. Use persistent identifiers!
# NOTE: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED BY DOCKER.
# All following disks (disk2, ...) WILL NOT BE FORMATTED.
# - /dev/disk/by-id/<id>:/disk1
# - dev/disk/by-id/<id>:/disk2
# group_add: # uncomment this line and the next one for using rootless podman containers
# - keep-groups # to make /dev/kvm work with podman. needs "crun" installed, "runc" will not work! Add your user to the 'kvm' group or another that can access /dev/kvm.
#- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive).
#- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives).

View File

@@ -1,11 +0,0 @@
(import (
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in
fetchTarball {
url =
lock.nodes.flake-compat.locked.url
or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
) { src = ./.; }).defaultNix

View File

@@ -6,34 +6,22 @@ Although WinApps supports using `QEMU+KVM+libvirt` as a backend for running Wind
> [!IMPORTANT]
> WinApps does __NOT__ officially support versions of Windows prior to Windows 10. Despite this, it may be possible to achieve a successful installation with some additional experimentation. If you find a way to achieve this, please share your solution through a pull request for the benefit of other users.
> Possible setup instructions for Windows 10:
> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will __NOT__ suffice.
> - It is recommended to edit the initial `compose.yaml` file to keep your required username and password from the beginning.
> - It is recommended to not use `sudo` to force commands to run. Add your user to the relevant permissions group wherever possible.
> [!IMPORTANT]
> The iptables kernel module must be loaded for folder sharing with the host to work.
> Check that the output of `lsmod | grep ip_tables` and `lsmod | grep iptable_nat` is non empty.
> If the output of one of the previous command is empty, run `echo -e "ip_tables\niptable_nat" | sudo tee /etc/modules-load.d/iptables.conf` and reboot.
## `Docker`
### Installation
You can find a guide for installing `Docker Engine` [here](https://docs.docker.com/engine/install/).
### Setup `Docker` Container
WinApps utilises `docker compose` to configure Windows VMs. A template [`compose.yaml`](../compose.yaml) is provided.
WinApps utilises `docker compose` to configure Windows VMs. A template [`compose.yaml`](https://github.com/winapps-org/winapps/blob/main/compose.yaml) is provided.
Prior to installing Windows, you can modify the RAM and number of CPU cores available to the Windows VM by changing `RAM_SIZE` and `CPU_CORES` within `compose.yaml`.
It is also possible to specify the version of Windows you wish to install within `compose.yaml` by modifying `VERSION`.
Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options.
> [!NOTE]
> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker compose` with `podman-compose`.
> ```bash
> docker compose down --rmi=all --volumes
> ```
> WinApps uses a stripped-down Windows installation by default. Although this is recommended, you can request a stock Windows installation by changing `VERSION` to one of the versions listed in the README of the [original GitHub repository](https://github.com/dockur/windows).
Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options.
### Installing Windows
You can initiate the Windows installation using `docker compose`.
@@ -44,19 +32,45 @@ docker compose --file ./compose.yaml up
You can then access the Windows virtual machine via a VNC connection to complete the Windows setup by navigating to http://127.0.0.1:8006 in your web browser.
### Changing `compose.yaml`
Changes to `compose.yaml` require the container to be removed and re-created. This should __NOT__ affect your data.
After installing Windows, comment out the following lines in the `compose.yaml` file by prepending a '#':
- `- ./oem:/oem`
- `- /path/to/windows/install/media.iso:/custom.iso` (if relevant)
Then, copy this modified `compose.yaml` file to `~/.config/winapps/compose.yaml`.
```bash
# Stop and remove the existing container.
cp ./compose.yaml ~/.config/winapps/compose.yaml
```
Finally, ensure the new configuration is applied by running the following:
```bash
docker compose --file ./compose.yaml down
docker compose --file ~/.config/winapps/compose.yaml up
```
### Installing WinApps
`Docker` simplifies the WinApps installation process by eliminating the need for any additional configuration of the Windows virtual machine. Once the Windows virtual machine is up and running, you can directly launch the WinApps installer, which should automatically detect and interface with Windows.
> [!NOTE]
> Since no Windows user password is set by default, Windows may automatically log in, which may cause the WinApps installation to fail due to complications establishing an RDP connection. To avoid this issue, please use the VNC connection to ensure that the Windows user is logged out before starting the WinApps installation.
```bash
bash <(curl https://raw.githubusercontent.com/winapps-org/winapps/main/setup.sh)
```
### Changing `compose.yaml`
Changes to `compose.yaml` require the Windows virtual machine to be removed and re-created. This should __NOT__ affect your data.
```bash
# Stop and remove the existing Windows virtual machine.
docker compose --file ~/.config/winapps/compose.yaml down
# Remove the existing FreeRDP certificate (if required).
# Note: A new certificate will be created when connecting via RDP for the first time.
rm ~/.config/freerdp/server/127.0.0.1_3389.pem
# Re-create the container with the updated configuration.
# Add the -d flag at the end to run the container in the background.
# Re-create the virtual machine with the updated configuration.
docker compose --file ~/.config/winapps/compose.yaml up
```
@@ -78,12 +92,6 @@ docker compose --file ~/.config/winapps/compose.yaml kill # Force shut down the
### Setup `Podman` Container
Please follow the [`docker` instructions](#setup-docker-container).
> [!NOTE]
> #### Rootless `podman` containers
> If you are invoking podman as a user, your container will be "rootless". This can be desirable as a security feature. However, you may encounter an error about missing permissions to /dev/kvm as a consequence.
>
> For rootless podman to work, you need to add your user to the `kvm` group (depending on your distribution) to be able to access `/dev/kvm`. Make sure that you are using `crun` as your container runtime, not `runc`. Usually this is done by stopping all containers and (de-)installing the corresponding packages. Then either invoke podman-compose as `podman-compose --file ./compose.yaml --podman-create-args '--group-add keep-groups' up`. Or edit `compose.yaml` and uncomment the `group_add:` section at the end.
> [!IMPORTANT]
> Ensure `WAFLAVOR` is set to `"podman"` in `~/.config/winapps/winapps.conf`.
@@ -96,18 +104,38 @@ podman-compose --file ./compose.yaml up
You can then access the Windows virtual machine via a VNC connection to complete the Windows setup by navigating to http://127.0.0.1:8006 in your web browser.
### Changing `compose.yaml`
Changes to `compose.yaml` require the container to be removed and re-created. This should __NOT__ affect your data.
After installing Windows, comment out the following lines in the `compose.yaml` file by prepending a '#':
- `- ./oem:/oem`
- `- /path/to/windows/install/media.iso:/custom.iso` (if relevant)
Then, copy this modified `compose.yaml` file to `~/.config/winapps/compose.yaml`.
```bash
# Stop and remove the existing container.
cp ./compose.yaml ~/.config/winapps/compose.yaml
```
Finally, ensure the new configuration is applied by running the following:
```bash
podman-compose --file ./compose.yaml down
podman-compose --file ~/.config/winapps/compose.yaml up
```
### Installing WinApps
Please follow the [`docker` instructions](#installing-winapps).
### Changing `compose.yaml`
Changes to `compose.yaml` require the Windows virtual machine to be removed and re-created. This should __NOT__ affect your data.
```bash
# Stop and remove the existing Windows virtual machine.
podman-compose --file ~/.config/winapps/compose.yaml down
# Remove the existing FreeRDP certificate (if required).
# Note: A new certificate will be created when connecting via RDP for the first time.
rm ~/.config/freerdp/server/127.0.0.1_3389.pem
# Re-create the container with the updated configuration.
# Re-create the virtual machine with the updated configuration.
podman-compose --file ~/.config/winapps/compose.yaml up
```

View File

@@ -28,18 +28,24 @@ Together, these components form a powerful and flexible virtualization stack, wi
3. Configure `libvirt` to use the 'system' URI by adding the line `LIBVIRT_DEFAULT_URI="qemu:///system"` to your preferred shell profile file (e.g., `.bashrc`, `.zshrc`, etc.).
```bash
echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' >> ~/.bashrc
echo "export LIBVIRT_DEFAULT_URI=\"qemu:///system\"" >> ~/.bashrc
```
4. Install `QEMU Guest Agent`.
```bash
sudo apt install qemu-guest-agent # Debian/Ubuntu
sudo dnf install qemu-guest-agent # Fedora/RHEL
sudo pacman -S qemu-guest-agent # Arch Linux
sudo emerge app-emulation/qemu-guest-agent # Gentoo Linux
sudo systemctl enable qemu-guest-agent
sudo systemctl start qemu-guest-agent
```
> [!NOTE]
> WinApps may not read your shell's configuration. If you're having issues getting the installer to detect your VM, try adding
> `LIBVIRT_DEFAULT_URI="qemu:///system"` to your `/etc/environment` like:
> ```bash
> echo 'LIBVIRT_DEFAULT_URI="qemu:///system"' | sudo tee -a /etc/environment
> ```
> Thanks to imoize for pointing this out: https://github.com/winapps-org/winapps/issues/310#issuecomment-2505348088
> `QEMU Guest Agent` is a helper daemon used to exchange information and commands between host and guest operating systems.
> You can read more about `QEMU Guest Agent` [here](https://pve.proxmox.com/wiki/Qemu-guest-agent).
4. Configure rootless `libvirt` and `kvm` by adding your user to groups of the same name.
5. Configure rootless `libvirt` and `kvm` by adding your user to groups of the same name.
``` bash
sudo usermod -a -G kvm $(id -un) # Add the user to the 'kvm' group.
sudo usermod -a -G libvirt $(id -un) # Add the user to the 'libvirt' group.
@@ -59,7 +65,7 @@ Together, these components form a powerful and flexible virtualization stack, wi
3. Reboot your system to ensure that the user is correctly added to the relevant groups.
5. If relevant to your distribution, disable `AppArmor` for the `libvirt` daemon.
6. If relevant to your distribution, disable `AppArmor` for the `libvirt` daemon.
``` bash
sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ # Disable AppArmor for the libvirt daemon by creating a symbolic link.
```
@@ -67,12 +73,12 @@ Together, these components form a powerful and flexible virtualization stack, wi
> [!NOTE]
> Systems with `SELinux` may also require security policy adjustments if virtual machine images are stored outside the default `/var/lib/libvirt/images` directory. Read [this guide](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/virtualization/sect-virtualization-security_for_virtualization-selinux_and_virtualization#sect-Virtualization-Security_for_virtualization-SELinux_and_virtualization) for more information.
6. Download a [Windows 10](https://www.microsoft.com/software-download/windows10ISO) or [Windows 11](https://www.microsoft.com/software-download/windows11) installation `.ISO` image.
7. Download a [Windows 10](https://www.microsoft.com/software-download/windows10ISO) or [Windows 11](https://www.microsoft.com/software-download/windows11) installation `.ISO` image.
> [!IMPORTANT]
> 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice.
7. Download [VirtIO drivers](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso) for the Windows virtual machine.
8. Download [VirtIO drivers](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso) for the Windows virtual machine.
> [!NOTE]
> VirtIO drivers enhance system performance and minimize overhead by enabling the Windows virtual machine to use specialised network and disk device drivers. These drivers are aware that they are operating inside a virtual machine, and cooperate with the hypervisor. This approach eliminates the need for the hypervisor to emulate physical hardware devices, which is a computationally expensive process. This setup allows guests to achieve high-performance network and disk operations, leveraging the benefits of paravirtualisation.
@@ -132,9 +138,6 @@ Together, these components form a powerful and flexible virtualization stack, wi
<img src="./libvirt_images/07.png" width="500px"/>
</p>
> [!NOTE]
> A name other than `RDPWindows` can be used if `VM_NAME` is set in `~/.config/winapps/winapps.conf`.
9. After clicking `Finish`, select `Copy host CPU configuration` under 'CPUs', and then click `Apply`.
> [!NOTE]
@@ -633,32 +636,19 @@ Status Name DisplayName
Running QEMU-GA QEMU Guest Agent
```
You can then test whether the host GNU/Linux system can communicate with Windows via `QEMU Guest Agent` by running `virsh qemu-agent-command RDPWindows '{"execute":"guest-get-osinfo"}' --pretty`. The output should resemble:
You can then test whether the host GNU/Linux system can communicate with Windows via `QEMU Guest Agent` by running `virsh qemu-agent-command RDPWindows '{"execute":"guest-info"}'`. The output should resemble:
```json
{
"return": {
"name": "Microsoft Windows",
"kernel-release": "26100",
"version": "Microsoft Windows 11",
"variant": "client",
"pretty-name": "Windows 10 Pro",
"version-id": "11",
"variant-id": "client",
"kernel-version": "10.0",
"machine": "x86_64",
"id": "mswindows"
}
}
```
{"return":{"version":"107.0.1","supported_commands":[{"enabled":true,"name":"guest-get-cpustats","success-response":true},{"enabled":true,"name":"guest-get-diskstats","success-response":true},{"enabled":true,"name":"guest-get-devices","success-response":true},{"enabled":true,"name":"guest-get-osinfo","success-response":true},{"enabled":true,"name":"guest-get-timezone","success-response":true},{"enabled":true,"name":"guest-get-users","success-response":true},{"enabled":true,"name":"guest-get-host-name","success-response":true},{"enabled":true,"name":"guest-exec","success-response":true},{"enabled":true,"name":"guest-exec-status","success-response":true},{"enabled":false,"name":"guest-get-memory-block-info","success-response":true},{"enabled":false,"name":"guest-set-memory-blocks","success-response":true},{"enabled":false,"name":"guest-get-memory-blocks","success-response":true},{"enabled":true,"name":"guest-set-user-password","success-response":true},{"enabled":true,"name":"guest-get-fsinfo","success-response":true},{"enabled":true,"name":"guest-get-disks","success-response":true},{"enabled":false,"name":"guest-set-vcpus","success-response":true},{"enabled":true,"name":"guest-get-vcpus","success-response":true},{"enabled":true,"name":"guest-network-get-interfaces","success-response":true},{"enabled":false,"name":"guest-suspend-hybrid","success-response":false},{"enabled":true,"name":"guest-suspend-ram","success-response":false},{"enabled":true,"name":"guest-suspend-disk","success-response":false},{"enabled":true,"name":"guest-fstrim","success-response":true},{"enabled":true,"name":"guest-fsfreeze-thaw","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze-list","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze","success-response":true},{"enabled":true,"name":"guest-fsfreeze-status","success-response":true},{"enabled":true,"name":"guest-file-flush","success-response":true},{"enabled":true,"name":"guest-file-seek","success-response":true},{"enabled":true,"name":"guest-file-write","success-response":true},{"enabled":true,"name":"guest-file-read","success-response":true},{"enabled":true,"name":"guest-file-close","success-response":true},{"enabled":true,"name":"guest-file-open","success-response":true},{"enabled":true,"name":"guest-shutdown","success-response":false},{"enabled":true,"name":"guest-info","success-response":true},{"enabled":true,"name":"guest-set-time","success-response":true},{"enabled":true,"name":"guest-get-time","success-response":true},{"enabled":true,"name":"guest-ping","success-response":true},{"enabled":true,"name":"guest-sync","success-response":true},{"enabled":true,"name":"guest-sync-delimited","success-response":true}]}}
```
Next, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](../oem/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`. Repeat the same thing for the [install.bat](../oem/install.bat) and the [NetProfileCleanup.ps1](../oem/NetProfileCleanup.ps1). **Do not download the Container.reg.**
Next, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](https://github.com/winapps-org/winapps/blob/main/oem/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`.
<p align="center">
<img src="./libvirt_images/26.png" width="700px"/>
</p>
Once you have downloaded all three files, right-click the install.bat and select "Run as administrator".
Once you have downloaded the registry file, right-click on it, and choose `Merge`.
<p align="center">
<img src="./libvirt_images/27.png" width="700px"/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 168 KiB

View File

@@ -6,7 +6,7 @@
height="394.31107"
id="svg171"
sodipodi:docname="Virtualisation_Stack.svg"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -27,14 +27,14 @@
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="1.4142136"
inkscape:cx="158.03836"
inkscape:cy="190.56527"
inkscape:window-width="1680"
inkscape:window-height="1050"
inkscape:cx="157.68481"
inkscape:cy="190.56528"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg171" />
inkscape:window-maximized="1"
inkscape:current-layer="Hardware" />
<title
id="title1">Open-source-virtualization-stack</title>
<style
@@ -207,15 +207,13 @@
fill-rule="evenodd"
class="s8"
d="m 266.57968,306.38322 c -0.6,-0.7 -1.6,-0.7 -2.2,0 l -6.2,6.2 c -0.6,0.6 -0.6,1.6 0,2.2 0.6,0.6 1.6,0.6 2.2,0 l 3.5,-3.6 v 18 c 0,0.9 0.7,1.5 1.6,1.5 0.8,0 1.5,-0.6 1.5,-1.5 v -18 l 3.6,3.6 c 0.6,0.6 1.6,0.6 2.2,0 0.6,-0.6 0.6,-1.6 0,-2.2 0,0 -6.2,-6.2 -6.2,-6.2 z"
inkscape:label="Arrow_Up"
style="fill:#999999" />
inkscape:label="Arrow_Up" />
<path
id="Arrow_6"
fill-rule="evenodd"
class="s8"
d="m 244.37968,330.28322 c 0.6,0.6 1.6,0.6 2.2,0 l 6.2,-6.2 c 0.6,-0.6 0.6,-1.6 0,-2.2 -0.6,-0.6 -1.6,-0.6 -2.2,0 l -3.6,3.5 v -17.9 c 0,-0.9 -0.7,-1.6 -1.5,-1.6 -0.9,0 -1.6,0.7 -1.6,1.6 v 17.9 l -3.5,-3.5 c -0.6,-0.6 -1.6,-0.6 -2.2,0 -0.6,0.6 -0.6,1.6 0,2.2 z"
inkscape:label="Arrow_Down"
style="fill:#999999" />
inkscape:label="Arrow_Down" />
</g>
</g>
<g
@@ -276,15 +274,13 @@
fill-rule="evenodd"
class="s8"
d="m 370.37233,213.93929 c -0.6,-0.7 -1.6,-0.7 -2.2,0 l -6.2,6.2 c -0.6,0.6 -0.6,1.6 0,2.2 0.6,0.6 1.6,0.6 2.2,0 l 3.5,-3.6 v 18 c 0,0.9 0.7,1.5 1.6,1.5 0.8,0 1.5,-0.6 1.5,-1.5 v -18 l 3.6,3.6 c 0.6,0.6 1.6,0.6 2.2,0 0.6,-0.6 0.6,-1.6 0,-2.2 0,0 -6.2,-6.2 -6.2,-6.2 z"
inkscape:label="Up_Arrow"
style="fill:#999999" />
inkscape:label="Up_Arrow" />
<path
id="Arrow_4"
fill-rule="evenodd"
class="s8"
d="m 348.17233,237.83929 c 0.6,0.6 1.6,0.6 2.2,0 l 6.2,-6.2 c 0.6,-0.6 0.6,-1.6 0,-2.2 -0.6,-0.6 -1.6,-0.6 -2.2,0 l -3.6,3.5 v -17.9 c 0,-0.9 -0.7,-1.6 -1.5,-1.6 -0.9,0 -1.6,0.7 -1.6,1.6 v 17.9 l -3.5,-3.5 c -0.6,-0.6 -1.6,-0.6 -2.2,0 -0.6,0.6 -0.6,1.6 0,2.2 0,0 6.2,6.2 6.2,6.2 z"
inkscape:label="Down_Arrow"
style="fill:#999999" />
inkscape:label="Down_Arrow" />
</g>
</g>
<g
@@ -496,32 +492,28 @@
class="s8"
d="m 185.26144,170.08528 c 0.7,-0.6 0.7,-1.6 0,-2.2 l -6.2,-6.2 c -0.6,-0.6 -1.6,-0.6 -2.2,0 -0.6,0.6 -0.6,1.6 0,2.2 l 3.6,3.6 h -18 c -0.9,0 -1.5,0.7 -1.5,1.5 0,0.9 0.6,1.6 1.5,1.6 h 18 l -3.6,3.5 c -0.6,0.6 -0.6,1.6 0,2.2 0.6,0.6 1.6,0.6 2.2,0 z"
inkscape:label="Right_Arrow"
transform="translate(-0.005896,-0.00237805)"
style="fill:#999999" />
transform="translate(-0.005896,-0.00237805)" />
<path
id="Arrow_3"
fill-rule="evenodd"
class="s8"
d="m 161.36144,147.88528 c -0.6,0.6 -0.6,1.6 0,2.2 l 6.2,6.2 c 0.6,0.6 1.6,0.6 2.2,0 0.6,-0.6 0.6,-1.6 0,-2.2 l -3.5,-3.5 h 17.9 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.8 -0.7,-1.5 -1.6,-1.5 h -17.9 l 3.5,-3.6 c 0.6,-0.6 0.6,-1.6 0,-2.2 -0.6,-0.6 -1.6,-0.6 -2.2,0 z"
inkscape:label="Left_Arrow"
transform="translate(-0.005896,-0.00237805)"
style="fill:#999999" />
transform="translate(-0.005896,-0.00237805)" />
<path
id="Arrow_0"
fill-rule="evenodd"
class="s8"
d="m 93.754521,93.097776 c -0.6,-0.7 -1.6,-0.7 -2.2,0 l -6.2,6.2 c -0.6,0.6 -0.6,1.600004 0,2.200004 0.6,0.6 1.6,0.6 2.2,0 l 3.5,-3.600004 v 18.000004 c 0,0.9 0.7,1.5 1.6,1.5 0.8,0 1.5,-0.6 1.5,-1.5 V 97.897776 l 3.6,3.600004 c 0.6,0.6 1.6,0.6 2.2,0 0.599999,-0.6 0.599999,-1.600004 0,-2.200004 0,0 -6.2,-6.2 -6.2,-6.2 z"
inkscape:label="Up_Arrow"
transform="translate(-0.005896,-0.00237805)"
style="fill:#999999" />
transform="translate(-0.005896,-0.00237805)" />
<path
id="Arrow_1"
fill-rule="evenodd"
class="s8"
d="m 71.554521,116.96028 c 0.6,0.6 1.6,0.6 2.2,0 l 6.2,-6.2 c 0.6,-0.6 0.6,-1.6 0,-2.2 -0.6,-0.6 -1.6,-0.6 -2.2,0 l -3.6,3.5 V 94.160276 c 0,-0.9 -0.7,-1.6 -1.5,-1.6 -0.9,0 -1.6,0.7 -1.6,1.6 v 17.900004 l -3.5,-3.5 c -0.6,-0.6 -1.6,-0.6 -2.2,0 -0.6,0.6 -0.6,1.6 0,2.2 z"
inkscape:label="Down_Arrow"
transform="translate(-0.005896,-0.00237805)"
style="fill:#999999" />
transform="translate(-0.005896,-0.00237805)" />
</g>
<g
id="g149"
@@ -551,7 +543,7 @@
id="GNU/Linux_Applications_Text"
x="-193.88689"
y="-3.0945449"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;font-family:Unageo;-inkscape-font-specification:'Unageo, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#808080;fill-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;font-family:Unageo;-inkscape-font-specification:'Unageo, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ffffff;fill-opacity:1"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan188"

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

76
flake.lock generated
View File

@@ -1,76 +0,0 @@
{
"nodes": {
"flake-compat": {
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"revCount": 57,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1724819573,
"narHash": "sha256-GnR7/ibgIH1vhoy8cYdmXE6iyZqKqFxQSVkFgosBh6w=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "71e91c409d1e654808b2621f28a327acfdad8dc2",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

View File

@@ -1,29 +0,0 @@
{
description = "WinApps Nix packages & NixOS module";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz";
flake-utils.url = "github:numtide/flake-utils";
};
outputs =
{
nixpkgs,
flake-utils,
...
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs { inherit system; };
in
{
formatter = pkgs.nixfmt-rfc-style;
packages.winapps = pkgs.callPackage ./packages/winapps { };
packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher { };
}
);
}

View File

@@ -1,3 +1,9 @@
# Copyright (c) 2024 Rohan Barar
# Copyright (c) 2024 Oskar Manhart
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
### FUNCTIONS ###
# Name: 'GetApplicationIcon'
# Role: Extract the icon from a given executable file as a base-64 string.

View File

@@ -1,4 +0,0 @@
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal"=dword:00000001

View File

@@ -1,30 +0,0 @@
# Get the current network profile name
$currentProfile = (Get-NetConnectionProfile).Name
# Get all profiles from the registry
$profilesKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles"
$profiles = Get-ChildItem -Path $profilesKey
foreach ($profile in $profiles) {
$profilePath = "$profilesKey\$($profile.PSChildName)"
$profileName = (Get-ItemProperty -Path $profilePath).ProfileName
# Remove profiles that don't match the current one
if ($profileName -ne $currentProfile) {
Remove-Item -Path $profilePath -Recurse
Write-Host "Deleted profile: $profileName"
}
}
# Change the current profile name to "WinApps"
$profiles = Get-ChildItem -Path $profilesKey
foreach ($profile in $profiles) {
$profilePath = "$profilesKey\$($profile.PSChildName)"
$profileName = (Get-ItemProperty -Path $profilePath).ProfileName
if ($profileName -eq $currentProfile) {
# Update the profile name
Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "WinApps"
Write-Host "Renamed profile to: WinApps"
}
}

View File

@@ -1,20 +1,14 @@
; Copyright (c) 2024 Fmstrat
; All rights reserved.
;
; SPDX-License-Identifier: Proprietary
Windows Registry Editor Version 5.00
; Disable RemoteApp allowlist so all applications can be used in Remote Desktop sessions
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList]
"fDisabledAllowList"=dword:00000001
; Allow unlisted programs to be run in Remote Desktop sessions
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]
"fAllowUnlistedRemotePrograms"=dword:00000001
; Disable automatic administrator logon at startup
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"AutoAdminLogon"="0"
; Always use the server's keyboard layout
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"IgnoreRemoteKeyboardLayout"=dword:00000001
; Disable "Do you want your PC to be discoverable" prompt after each host system reboot
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff]

View File

@@ -1,25 +1,7 @@
@echo off
REM Copyright (c) 2024 Oskar Manhart
REM All rights reserved.
REM
REM SPDX-License-Identifier: AGPL-3.0-or-later
reg import %~dp0\RDPApps.reg
if exists %~dp0\Container.reg (
reg import %~dp0\Container.reg
)
REM Create network profile cleanup scheduled task
copy %~dp0\NetProfileCleanup.ps1 %windir%
set "taskname=NetworkProfileCleanup"
set "command=powershell.exe -ExecutionPolicy Bypass -File "%windir%\NetProfileCleanup.ps1^""
schtasks /query /tn "%taskname%" >nul 2>&1
if %ERRORLEVEL% equ 0 (
echo Task "%taskname%" already exists, deleting it first...
schtasks /delete /tn "%taskname%" /f
)
schtasks /create /tn "%taskname%" /tr "%command%" /sc onstart /ru "SYSTEM" /rl HIGHEST /f
if %ERRORLEVEL% equ 0 (
echo Scheduled task "%taskname%" created successfully.
) else (
echo Failed to create scheduled task.
)
REG IMPORT C:\OEM\RDPApps.reg

View File

@@ -1,11 +0,0 @@
--- a/WinApps-Launcher.sh
+++ b/WinApps-Launcher.sh
@@ -19,7 +19,7 @@ declare -rx EC_WIN_NOT_SPEC=6
declare -rx EC_NO_WIN_FOUND=7
# Paths
-declare -rx ICONS_PATH="./Icons"
+declare -rx ICONS_PATH="@out@/Icons"
declare -rx APPDATA_PATH="${HOME}/.local/share/winapps"
declare -rx CONFIG_PATH="${HOME}/.config/winapps"
declare -rx CONFIG_FILE="${CONFIG_PATH}/winapps.conf"

View File

@@ -1,72 +0,0 @@
{
stdenv,
lib,
fetchFromGitHub,
makeWrapper,
makeDesktopItem,
callPackage,
yad,
...
}:
let
rev = "9b3f6c581791222a3a04508606755d6d0519f322";
hash = "sha256-Hy/o5IY9HmTWaX54Ek5ABmppPpzgM+MdCrhzEzVmtwY=";
in
stdenv.mkDerivation rec {
pname = "winapps-launcher";
version = "0-unstable-2025-03-11";
src = fetchFromGitHub {
owner = "winapps-org";
repo = "WinApps-Launcher";
inherit rev hash;
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
yad
(callPackage ../winapps { })
];
patches = [ ./WinApps-Launcher.patch ];
postPatch = ''
substituteAllInPlace WinApps-Launcher.sh
'';
installPhase = ''
runHook preInstall
mkdir -p $out
cp -r ./Icons $out/Icons
install -m755 -D WinApps-Launcher.sh $out/bin/winapps-launcher
install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg
wrapProgram $out/bin/winapps-launcher \
--set LIBVIRT_DEFAULT_URI "qemu:///system" \
--prefix PATH : "${lib.makeBinPath buildInputs}"
runHook postInstall
'';
desktopItems = [
(makeDesktopItem {
name = "winapps";
exec = "winapps-launcher";
icon = "winapps";
comment = meta.description;
desktopName = "WinApps";
categories = [ "Utility" ];
})
];
meta = with lib; {
homepage = "https://github.com/winapps-org/WinApps-Launcher";
description = "Graphical launcher for WinApps. Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported.";
mainProgram = "winapps-launcher";
platforms = platforms.linux;
license = licenses.gpl3;
};
}

View File

@@ -1,75 +0,0 @@
{
stdenv,
lib,
fetchFromGitHub,
makeWrapper,
freerdp3,
dialog,
libnotify,
netcat,
iproute2,
...
}:
let
rev = "e2e9fd9b7b66bd1432c2a7186017da5c281d5b9e";
hash = "sha256-N6ArgdiJyhWNALqpRxLR6RDDMsiqEf2RxWLQ2z7T23Y=";
in
stdenv.mkDerivation rec {
pname = "winapps";
version = "0-unstable-2025-06-10";
src = fetchFromGitHub {
owner = "winapps-org";
repo = "winapps";
inherit rev hash;
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
freerdp3
libnotify
dialog
netcat
iproute2
];
patches = [
./winapps.patch
./setup.patch
];
postPatch = ''
substituteAllInPlace bin/winapps
substituteAllInPlace setup.sh
patchShebangs install/inquirer.sh
'';
installPhase = ''
runHook preInstall
mkdir -p $out
mkdir -p $out/src
cp -r ./ $out/src/
install -m755 -D bin/winapps $out/bin/winapps
install -m755 -D setup.sh $out/bin/winapps-setup
for f in winapps-setup winapps; do
wrapProgram $out/bin/$f \
--set LIBVIRT_DEFAULT_URI "qemu:///system" \
--prefix PATH : "${lib.makeBinPath buildInputs}"
done
runHook postInstall
'';
meta = with lib; {
homepage = "https://github.com/winapps-org/winapps";
description = "Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported.";
mainProgram = "winapps";
platforms = platforms.linux;
license = licenses.agpl3Plus;
};
}

View File

@@ -1,163 +0,0 @@
diff --git a/setup.sh b/setup.sh
index 0debe4d..6aeea08 100755
--- a/setup.sh
+++ b/setup.sh
@@ -39,8 +39,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir
readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation.
readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation.
# 'SOURCE'
-readonly SYS_SOURCE_PATH="${SYS_BIN_PATH}/winapps-src" # UNIX path to WinApps source directory for a '--system' WinApps installation.
-readonly USER_SOURCE_PATH="${USER_BIN_PATH}/winapps-src" # UNIX path to WinApps source directory for a '--system' WinApps installation.
+readonly SYS_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation.
+readonly USER_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation.
# 'APP'
readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation.
readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation.
@@ -70,7 +70,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN
# 'WinApps Configuration File'
readonly CONFIG_PATH="${HOME}/.config/winapps/winapps.conf" # UNIX path to the WinApps configuration file.
# 'Inquirer Bash Script'
-readonly INQUIRER_PATH="./install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus.
+readonly INQUIRER_PATH="@out@/src/install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus.
# REMOTE DESKTOP CONFIGURATION
readonly RDP_PORT=3389 # Port used for RDP on Windows.
@@ -155,13 +155,6 @@ function waGetSourceCode() {
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You might want to remove your old installation on '${SCRIPT_DIR_PATH}'."
fi
- if [[ ! -d "$SOURCE_PATH" ]]; then
- $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH"
- else
- echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}"
- $SUDO git -C "$SOURCE_PATH" pull --no-rebase
- fi
-
# Silently change the working directory.
if ! cd "$SOURCE_PATH" &>/dev/null; then
# Display the error type.
@@ -186,21 +179,8 @@ function waGetSourceCode() {
# Name: 'waGetInquirer'
# Role: Loads the inquirer script, even if the source isn't cloned yet
function waGetInquirer() {
- local INQUIRER=$INQUIRER_PATH
-
- if [ -d "$SYS_SOURCE_PATH" ]; then
- INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH
- elif [ -d "$USER_SOURCE_PATH" ] ; then
- INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH
- else
- INQUIRER="/tmp/waInquirer.sh"
- rm -f "$INQUIRER"
-
- curl -o "$INQUIRER" "https://raw.githubusercontent.com/winapps-org/winapps/main/install/inquirer.sh"
- fi
-
# shellcheck source=/dev/null # Exclude this file from being checked by ShellCheck.
- source "$INQUIRER"
+ source "$INQUIRER_PATH"
}
# Name: 'waCheckInput'
@@ -805,7 +785,7 @@ function waCheckGroupMembership() {
# Identify groups the current user belongs to.
USER_GROUPS=$(groups "$(whoami)")
- if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirt\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then
+ if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirtd\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then
# Complete the previous line.
echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n"
@@ -1239,11 +1219,11 @@ function waConfigureWindows() {
# Populate variables.
WIN_BASH="\
#!/usr/bin/env bash
-${BIN_PATH}/winapps windows"
+@out@/bin/winapps windows"
WIN_DESKTOP="\
[Desktop Entry]
Name=Windows
-Exec=${BIN_PATH}/winapps windows %F
+Exec=@out@/bin/winapps windows %F
Terminal=false
Type=Application
Icon=${APPDATA_PATH}/icons/windows.svg
@@ -1290,13 +1270,13 @@ function waConfigureApp() {
# Determine the content of the bash script for the application.
APP_BASH="\
#!/usr/bin/env bash
-${BIN_PATH}/winapps ${1}"
+@out@/bin/winapps ${1}"
# Determine the content of the '.desktop' file for the application.
APP_DESKTOP_FILE="\
[Desktop Entry]
Name=${NAME}
-Exec=${BIN_PATH}/winapps ${1} %F
+Exec=@out@/bin/winapps ${1} %F
Terminal=false
Type=Application
Icon=${APP_ICON}
@@ -1550,7 +1530,7 @@ function waInstall() {
echo -e "${BOLD_TEXT}Installing WinApps.${CLEAR_TEXT}"
# Check for existing conflicting WinApps installations.
- waCheckExistingInstall
+ # waCheckExistingInstall
# Load the WinApps configuration file.
waLoadConfig
@@ -1626,8 +1606,8 @@ function waInstall() {
waFindInstalled
# Install the WinApps bash scripts.
- $SUDO ln -sf "${SOURCE_PATH}/bin/winapps" "${BIN_PATH}/winapps"
- $SUDO ln -sf "${SOURCE_PATH}/setup.sh" "${BIN_PATH}/winapps-setup"
+
+
# Configure the Windows RDP session application launcher.
waConfigureWindows
@@ -1677,18 +1657,15 @@ function waUninstall() {
local DESKTOP_FILE_NAME="" # Stores the name of the '.desktop' file for the application.
local BASH_SCRIPT_NAME="" # Stores the name of the application.
- # Remove the 'WinApps' bash scripts.
- $SUDO rm -f "${BIN_PATH}/winapps"
- $SUDO rm -f "${BIN_PATH}/winapps-setup"
-
# Remove WinApps configuration data, temporary files and logs.
+ chmod -R +rw "$USER_APPDATA_PATH"
rm -rf "$USER_APPDATA_PATH"
# Remove application icons and shortcuts.
$SUDO rm -rf "$APPDATA_PATH"
# Store '.desktop' files containing "${BIN_PATH}/winapps" in an array, returning an empty array if no such files exist.
- readarray -t WINAPPS_DESKTOP_FILES < <(grep -l -d skip "${BIN_PATH}/winapps" "${APP_PATH}/"* 2>/dev/null || true)
+ readarray -t WINAPPS_DESKTOP_FILES < <(grep -l -d skip "@out@/bin/winapps" "${APP_PATH}/"* 2>/dev/null || true)
# Remove each '.desktop' file.
for DESKTOP_FILE_PATH in "${WINAPPS_DESKTOP_FILES[@]}"; do
@@ -1709,7 +1686,7 @@ function waUninstall() {
done
# Store the paths of bash scripts calling 'WinApps' to launch specific applications in an array, returning an empty array if no such files exist.
- readarray -t WINAPPS_APP_BASH_SCRIPTS < <(grep -l -d skip "${BIN_PATH}/winapps" "${BIN_PATH}/"* 2>/dev/null || true)
+ readarray -t WINAPPS_APP_BASH_SCRIPTS < <(grep -l -d skip "@out@/bin/winapps" "${BIN_PATH}/"* 2>/dev/null || true)
# Remove each bash script.
for BASH_SCRIPT_PATH in "${WINAPPS_APP_BASH_SCRIPTS[@]}"; do
@@ -1730,10 +1707,9 @@ function waUninstall() {
done
# Print caveats.
- echo -e "\n${INFO_TEXT}Please note that your WinApps configuration and the WinApps source code were not removed.${CLEAR_TEXT}"
- echo -e "${INFO_TEXT}You can remove these manually by running:${CLEAR_TEXT}"
+ echo -e "\n${INFO_TEXT}Please note that your WinApps configuration and the WinApps package were not removed.${CLEAR_TEXT}"
+ echo -e "${INFO_TEXT}You can remove your config manually by running:${CLEAR_TEXT}"
echo -e "${COMMAND_TEXT}rm -r $(dirname "$CONFIG_PATH")${CLEAR_TEXT}"
- echo -e "${COMMAND_TEXT}rm -r ${SOURCE_PATH}${CLEAR_TEXT}\n"
# Print feedback.
echo -e "${SUCCESS_TEXT}UNINSTALLATION COMPLETE.${CLEAR_TEXT}"

View File

@@ -1,11 +0,0 @@
--- a/bin/winapps
+++ b/bin/winapps
@@ -295,7 +295,7 @@ function waCheckGroupMembership() {
# shellcheck disable=SC2155 # Silence warnings regarding masking return values through simultaneous declaration and assignment.
local USER_GROUPS=$(groups "$(whoami)")
- if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirt\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then
+ if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirtd\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then
waThrowExit "$EC_NOT_IN_GROUP"
fi
}

113
setup.sh
View File

@@ -1,4 +1,13 @@
#!/usr/bin/env bash
# Copyright (c) 2024 Felix Bartels
# Copyright (c) 2024 Coruscant11
# Copyright (c) 2024 escapefreeg
# Copyright (c) 2024 Rohan Barar
# Copyright (c) 2024 Oskar Manhart
# Copyright (c) 2024 Sebastien Bürky
# All rights reserved.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# shellcheck disable=SC2034 # Silence warnings regarding unused variables globally.
@@ -73,6 +82,7 @@ readonly CONFIG_PATH="${HOME}/.config/winapps/winapps.conf" # UNIX path to the W
readonly INQUIRER_PATH="./install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus.
# REMOTE DESKTOP CONFIGURATION
readonly VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY).
readonly RDP_PORT=3389 # Port used for RDP on Windows.
readonly DOCKER_IP="127.0.0.1" # Localhost.
@@ -84,21 +94,17 @@ OPT_UNINSTALL=0 # Set to '1' if the user specifies '--uninstall'.
OPT_AOSA=0 # Set to '1' if the user specifies '--setupAllOfficiallySupportedApps'.
# WINAPPS CONFIGURATION FILE
RDP_USER="" # Imported variable.
RDP_PASS="" # Imported variable.
RDP_DOMAIN="" # Imported variable.
RDP_IP="" # Imported variable.
VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY).
WAFLAVOR="docker" # Imported variable.
RDP_SCALE=100 # Imported variable.
RDP_FLAGS="" # Imported variable.
MULTIMON="false" # Imported variable.
DEBUG="true" # Imported variable.
FREERDP_COMMAND="" # Imported variable.
MULTI_FLAG="" # Set based on value of $MULTIMON.
PORT_TIMEOUT=5 # Default port check timeout.
RDP_TIMEOUT=30 # Default RDP connection test timeout.
APP_SCAN_TIMEOUT=60 # Default application scan timeout.
RDP_USER="" # Imported variable.
RDP_PASS="" # Imported variable.
RDP_DOMAIN="" # Imported variable.
RDP_IP="" # Imported variable.
WAFLAVOR="docker" # Imported variable.
RDP_SCALE=100 # Imported variable.
RDP_FLAGS="" # Imported variable.
MULTIMON="false" # Imported variable.
DEBUG="true" # Imported variable.
FREERDP_COMMAND="" # Imported variable.
MULTI_FLAG="" # Set based on value of $MULTIMON.
# PERMISSIONS AND DIRECTORIES
SUDO="" # Set to "sudo" if the user specifies '--system', or "" if the user specifies '--user'.
@@ -133,13 +139,13 @@ function waTerminateScript() {
# Role: Displays usage information for the script.
function waUsage() {
echo -e "Usage:
${COMMAND_TEXT} --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME}
${COMMAND_TEXT} --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr
${COMMAND_TEXT} --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME}
${COMMAND_TEXT} --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr
${COMMAND_TEXT} --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME}
${COMMAND_TEXT} --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr
${COMMAND_TEXT} --help${CLEAR_TEXT} # Display this usage message."
${COMMAND_TEXT}./setup.sh --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME}
${COMMAND_TEXT}./setup.sh --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr
${COMMAND_TEXT}./setup.sh --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME}
${COMMAND_TEXT}./setup.sh --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr
${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME}
${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr
${COMMAND_TEXT}./setup.sh --help${CLEAR_TEXT} # Display this usage message."
}
# Name: 'waGetSourceCode'
@@ -152,7 +158,7 @@ function waGetSourceCode() {
SCRIPT_DIR_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
# Check if winapps is currently installed on $SOURCE_PATH
if [[ -f "$SCRIPT_DIR_PATH/winapps" && "$SCRIPT_DIR_PATH" -ne "$SOURCE_PATH" ]]; then
if [ -f "$SCRIPT_DIR_PATH/winapps" ] && [ "$SCRIPT_DIR_PATH" -ne "$SOURCE_PATH" ]; then
# Display a warning.
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You are running a WinApps installation located outside of default location '${SOURCE_PATH}'. A new installation will be created."
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You might want to remove your old installation on '${SCRIPT_DIR_PATH}'."
@@ -191,11 +197,7 @@ function waGetSourceCode() {
function waGetInquirer() {
local INQUIRER=$INQUIRER_PATH
if [ -d "$SYS_SOURCE_PATH" ]; then
INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH
elif [ -d "$USER_SOURCE_PATH" ] ; then
INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH
else
if [ ! -d "$SYS_SOURCE_PATH" ] && [ ! -d "$USER_SOURCE_PATH" ]; then
INQUIRER="/tmp/waInquirer.sh"
rm -f "$INQUIRER"
@@ -393,7 +395,7 @@ function waCheckExistingInstall() {
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --user --uninstall${CLEAR_TEXT}."
echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT}."
echo "--------------------------------------------------------------------------------"
# Terminate the script.
@@ -413,7 +415,7 @@ function waCheckExistingInstall() {
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT}."
echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT}."
echo "--------------------------------------------------------------------------------"
# Terminate the script.
@@ -991,7 +993,7 @@ function waCheckPortOpen() {
fi
# Check for an open RDP port.
if ! timeout "$PORT_TIMEOUT" nc -z "$RDP_IP" "$RDP_PORT" &>/dev/null; then
if ! timeout 5 nc -z "$RDP_IP" "$RDP_PORT" &>/dev/null; then
# Complete the previous line.
echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n"
@@ -1004,7 +1006,6 @@ function waCheckPortOpen() {
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo "Please ensure Remote Desktop is configured on Windows as per the WinApps README."
echo -e "Then you can try increasing the ${COMMAND_TEXT}PORT_TIMEOUT${CLEAR_TEXT} in ${COMMAND_TEXT}${CONFIG_PATH}${CLEAR_TEXT}."
echo "--------------------------------------------------------------------------------"
# Terminate the script.
@@ -1050,7 +1051,7 @@ function waCheckRDPAccess() {
+home-drive \
-wallpaper \
+dynamic-resolution \
/app:program:"C:\Windows\System32\cmd.exe",cmd:"/C type NUL > $TEST_PATH_WIN && tsdiscon" \
/app:program:"C:\Windows\System32\cmd.exe",cmd:"/C type NUL > "$TEST_PATH_WIN" && tsdiscon" \
/v:"$RDP_IP" &>"$FREERDP_LOG" &
# Store the FreeRDP process ID.
@@ -1059,8 +1060,8 @@ function waCheckRDPAccess() {
# Initialise the time counter.
ELAPSED_TIME=0
# Wait a maximum of $RDP_TIMEOUT seconds for the background process to complete.
while [ "$ELAPSED_TIME" -lt "$RDP_TIMEOUT" ]; do
# Wait a maximum of 30 seconds for the background process to complete.
while [ "$ELAPSED_TIME" -lt 30 ]; do
# Check if the FreeRDP process is complete or if the test file exists.
if ! ps -p "$FREERDP_PROC" &>/dev/null || [ -f "$TEST_PATH" ]; then
break
@@ -1095,7 +1096,6 @@ function waCheckRDPAccess() {
echo " - Ensure the user is logged out of Windows prior to initiating the WinApps installation."
echo " - Ensure the credentials within the WinApps configuration file are correct."
echo -e " - Utilise a new certificate by removing relevant certificate(s) in ${COMMAND_TEXT}${HOME}/.config/freerdp/server${CLEAR_TEXT}."
echo -e " - Try increasing the ${COMMAND_TEXT}RDP_TIMEOUT${CLEAR_TEXT} in ${COMMAND_TEXT}${CONFIG_PATH}${CLEAR_TEXT}."
echo " - If using 'libvirt', ensure the Windows VM is correctly named as specified within the README."
echo " - If using 'libvirt', ensure 'Remote Desktop' is enabled within the Windows VM."
echo " - If using 'libvirt', ensure you have merged 'RDPApps.reg' into the Windows VM's registry."
@@ -1142,10 +1142,6 @@ function waFindInstalled() {
# Extract the name of the application from the absolute path of the folder.
APPLICATION="$(basename "$APPLICATION")"
if [[ "$APPLICATION" == "ms-office-protocol-handler.desktop" ]]; then
continue
fi
# Source 'Info' File Containing:
# - The Application Name (FULL_NAME)
# - The Shortcut Name (NAME)
@@ -1193,8 +1189,8 @@ function waFindInstalled() {
# Initialise the time counter.
ELAPSED_TIME=0
# Wait a maximum of $APP_SCAN_TIMEOUT seconds for the batch script to finish running.
while [ $ELAPSED_TIME -lt "$APP_SCAN_TIMEOUT" ]; do
# Wait a maximum of 60 seconds for the batch script to finish running.
while [ $ELAPSED_TIME -lt 60 ]; do
# Check if the FreeRDP process is complete or if the 'installed' file exists.
if ! ps -p "$FREERDP_PROC" &>/dev/null || [ -f "$INST_FILE_PATH" ]; then
break
@@ -1225,7 +1221,6 @@ function waFindInstalled() {
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo -e "Please view the log at ${COMMAND_TEXT}${FREERDP_LOG}${CLEAR_TEXT}."
echo -e "You can try increasing the ${COMMAND_TEXT}APP_SCAN_TIMEOUT${CLEAR_TEXT} in ${COMMAND_TEXT}${CONFIG_PATH}${CLEAR_TEXT}."
echo "--------------------------------------------------------------------------------"
# Terminate the script.
@@ -1330,9 +1325,9 @@ MimeType=${MIME_TYPES}"
function waConfigureOfficiallySupported() {
# Declare variables.
local OSA_LIST=() # Stores a list of all officially supported applications installed on Windows.
local OFFICE_APPS=("access" "access-o365" "access-o365-x86" "access-x86" "adobe-cc" "acrobat9" "acrobat-x-pro" "aftereffects-cc" "audition-cc" "bridge-cc" "bridge-cc-x86" "bridge-cs6" "bridge-cs6-x86" "cmd" "dymo-connect" "excel" "excel-o365" "excel-o365-x86" "excel-x86" "excel-x86-2010" "explorer" "iexplorer" "illustrator-cc" "lightroom-cc" "linqpad8" "mirc" "mspaint" "onenote" "onenote-o365" "onenote-o365-x86" "onenote-x86" "outlook" "outlook-o365" "outlook-o365-x86" "powerpoint" "powerpoint-o365" "powerpoint-o365-x86" "powerpoint-x86" "publisher" "publisher-o365" "publisher-o365-x86" "publisher-x86" "project" "project-x86" "remarkable-desktop" "ssms20" "visual-studio-comm" "visual-studio-ent" "visual-studio-pro" "visio" "visio-x86" "word" "word-o365" "word-o365-x86" "word-x86" "word-x86-2010")
# Read the list of officially supported applications that are installed on Windows into an array, returning an empty array if no such files exist.
# This will remove leading and trailing whitespace characters as well as ignore empty lines.
readarray -t OSA_LIST < <(grep -v '^[[:space:]]*$' "$INST_FILE_PATH" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' 2>/dev/null || true)
# Create application entries for each officially supported application.
@@ -1346,19 +1341,6 @@ function waConfigureOfficiallySupported() {
# Configure the application.
waConfigureApp "$OSA" svg
# Check if the application is an Office app and copy the protocol handler.
if [[ " ${OFFICE_APPS[*]} " == *" $OSA "* ]]; then
# Determine the target directory based on whether the installation is for the system or user.
if [[ "$OPT_SYSTEM" -eq 1 ]]; then
TARGET_DIR="$SYS_APP_PATH"
else
TARGET_DIR="$USER_APP_PATH"
fi
# Copy the protocol handler to the appropriate directory.
$SUDO cp "./apps/ms-office-protocol-handler.desktop" "$TARGET_DIR/ms-office-protocol-handler.desktop"
fi
# Print feedback.
echo -e "${DONE_TEXT}Done!${CLEAR_TEXT}"
done
@@ -1676,13 +1658,13 @@ function waInstall() {
# Name: 'waEnsureOnPath'
# Role: Ensures that $BIN_PATH is on $PATH.
function waEnsureOnPath() {
if [[ ":$PATH:" != *":$BIN_PATH:"* ]]; then
if [[ ":$PATH:" == *":$BIN_PATH:"* ]]; then
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH."
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:"
# shellcheck disable=SC2086
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For Bash: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.bashrc && source ~/.bashrc${CLEAR_TEXT}"
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For Bash: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.bashrc${CLEAR_TEXT}"
# shellcheck disable=SC2086
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For ZSH: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.zshrc && source ~/.zshrc${CLEAR_TEXT}"
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For ZSH: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.zshrc${CLEAR_TEXT}"
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} Make sure to restart your Terminal afterwards.\n"
fi
}
@@ -1690,21 +1672,10 @@ function waEnsureOnPath() {
# Name: 'waUninstall'
# Role: Uninstalls WinApps.
function waUninstall() {
# Print feedback.
[ "$OPT_SYSTEM" -eq 1 ] && echo -e "${BOLD_TEXT}REMOVING SYSTEM INSTALLATION.${CLEAR_TEXT}"
[ "$OPT_USER" -eq 1 ] && echo -e "${BOLD_TEXT}REMOVING USER INSTALLATION.${CLEAR_TEXT}"
# Determine the target directory for the protocol handler based on the installation type.
if [[ "$OPT_SYSTEM" -eq 1 ]]; then
TARGET_DIR="$SYS_APP_PATH"
else
TARGET_DIR="$USER_APP_PATH"
fi
# Remove the 'ms-office-protocol-handler.desktop' file if it exists.
$SUDO rm -f "$TARGET_DIR/ms-office-protocol-handler.desktop"
# Declare variables.
local WINAPPS_DESKTOP_FILES=() # Stores a list of '.desktop' file paths.
local WINAPPS_APP_BASH_SCRIPTS=() # Stores a list of bash script paths.