18 Commits

Author SHA1 Message Date
Oskar Manhart
1c4b38b7ec Merge pull request #620 from wovw/nix-icons
fix(nix): include icons dir for setup script
2025-07-31 08:29:00 +01:00
anthony pasala
34c8168548 fix(nix): include icons dir for setup script 2025-07-31 00:09:17 -04:00
Oskar Manhart
03dff50916 fix(nix): correct build failure 2025-07-22 18:24:10 +02:00
Oskar Manhart
4010972963 Merge branch 'main' of github.com:winapps-org/winapps 2025-07-22 18:20:47 +02:00
Oskar Manhart
01d72eac5b feat: use garnix 2025-07-22 18:20:00 +02:00
Oskar Manhart
223ba8ecb0 Merge pull request #575 from eylenburg/boot_windows
Wait a bit before running command if Windows is not booted
2025-07-22 17:57:08 +02:00
eylenburg
8e0ef40b1f Update README.md 2025-07-22 14:32:12 +01:00
eylenburg
8796615775 Merge branch 'winapps-org:main' into boot_windows 2025-07-22 14:31:21 +01:00
eylenburg
ee967296a6 Update winapps 2025-07-02 14:37:13 +01:00
eylenburg
abf4c7ae66 Update winapps 2025-07-02 14:02:43 +01:00
eylenburg
d250907a3c Update winapps 2025-07-02 13:54:45 +01:00
eylenburg
efa348d1b3 Merge branch 'winapps-org:main' into boot_windows 2025-07-02 12:28:33 +01:00
eylenburg
17a511230c Update README.md 2025-06-23 12:19:56 +01:00
eylenburg
8ea5c2e079 Update winapps 2025-06-23 12:18:10 +01:00
eylenburg
3e84f5efdf Update winapps 2025-06-23 12:16:44 +01:00
eylenburg
3a71065db7 Merge branch 'winapps-org:main' into main 2025-06-23 12:11:32 +01:00
pre-commit-ci[bot]
8b8e50aeaf [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-06-20 10:14:57 +00:00
eylenburg
12dee36bdc Wait a bit before running command if Windows is not booted 2025-06-20 11:06:01 +01:00
8 changed files with 152 additions and 72 deletions

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

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
/.idea
/.vscode
/result

View File

@@ -469,6 +469,11 @@ RDP_TIMEOUT="30"
# DEFAULT VALUE: '60'
APP_SCAN_TIMEOUT="60"
# WINDOWS BOOT
# - The maximum time (in seconds) to wait for the Windows VM to boot if it is not running, before attempting to launch an application.
# DEFAULT VALUE: '120'
BOOT_TIMEOUT="120"
```
> [!IMPORTANT]
@@ -590,10 +595,6 @@ 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
@@ -640,12 +641,6 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional
...
}:
{
# 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

View File

@@ -50,9 +50,11 @@ RDP_SCALE=100
AUTOPAUSE="off"
AUTOPAUSE_TIME="300"
DEBUG="true"
BOOT_TIMEOUT=120
# OTHER
FREERDP_PID=-1
NEEDED_BOOT=false
### TRAPS ###
# Catch SIGINT (CTRL+C) to call 'waCleanUp'.
@@ -323,6 +325,7 @@ function waCheckVMRunning() {
if (virsh list --state-shutoff --name | xargs | grep -wq "$VM_NAME"); then
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
NEEDED_BOOT=true
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
if (virsh list --state-paused --name | xargs | grep -wq "$VM_NAME"); then
dprint "WINDOWS PAUSED. RESUMING WINDOWS."
@@ -344,6 +347,7 @@ function waCheckVMRunning() {
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
NEEDED_BOOT=true
break
fi
sleep $TIME_INTERVAL
@@ -357,6 +361,7 @@ function waCheckVMRunning() {
dprint "WINDOWS DESTROYED. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
NEEDED_BOOT=true
fi
elif (virsh domstate "$VM_NAME" | xargs | grep -wq "dying"); then
dprint "WINDOWS DYING. WAITING."
@@ -372,6 +377,7 @@ function waCheckVMRunning() {
dprint "WINDOWS DESTROYED. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
NEEDED_BOOT=true
fi
break
elif (virsh list --state-shutoff --name | xargs | grep -wq "$VM_NAME"); then
@@ -379,6 +385,7 @@ function waCheckVMRunning() {
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
NEEDED_BOOT=true
break
fi
sleep $TIME_INTERVAL
@@ -395,6 +402,45 @@ function waCheckVMRunning() {
# Handle non-zero exit statuses.
[ "$EXIT_STATUS" -ne 0 ] && waThrowExit "$EXIT_STATUS"
# Wait for VM to be fully ready
if [[ "$NEEDED_BOOT" == "true" ]]; then
dprint "WAITING FOR VM TO BE FULLY READY..."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Waiting for Windows to be ready..."
TIME_ELAPSED=0
while (( TIME_ELAPSED < BOOT_TIMEOUT )); do
# Check if VM is running
if (virsh list --state-running --name | xargs | grep -wq "$VM_NAME"); then
# Try to connect to RDP port to verify it's ready
if timeout 1 bash -c ">/dev/tcp/$RDP_IP/$RDP_PORT" 2>/dev/null; then
dprint "VM IS READY"
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Windows is ready."
# Add a delay after Windows is ready
if [ "$NEEDED_BOOT" = "true" ]; then
sleep 10
fi
break
fi
fi
sleep 5
TIME_ELAPSED=$((TIME_ELAPSED + 5))
# Show progress every 30 seconds
if (( TIME_ELAPSED % 30 == 0 )); then
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Still waiting for Windows to be ready... ($TIME_ELAPSED seconds elapsed)"
fi
done
# If we timed out waiting for the VM
if (( TIME_ELAPSED >= BOOT_TIMEOUT )); then
dprint "TIMEOUT WAITING FOR VM TO BE READY"
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Timeout waiting for Windows to be ready. Please try again."
waThrowExit $EC_FAIL_START
fi
fi
}
# Name: 'waCheckContainerRunning'
@@ -426,6 +472,7 @@ function waCheckContainerRunning() {
dprint "WINDOWS CREATED. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
$COMPOSE_COMMAND --file "$COMPOSE_PATH" start &>/dev/null
NEEDED_BOOT=true
;;
"restarting")
dprint "WINDOWS RESTARTING. WAITING."
@@ -436,6 +483,7 @@ function waCheckContainerRunning() {
EXIT_STATUS=0
dprint "WINDOWS RESTARTED."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Restarted Windows."
NEEDED_BOOT=true
break
fi
sleep $TIME_INTERVAL
@@ -451,11 +499,13 @@ function waCheckContainerRunning() {
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
$COMPOSE_COMMAND --file "$COMPOSE_PATH" start &>/dev/null
NEEDED_BOOT=true
;;
"dead")
dprint "WINDOWS DEAD. RECREATING WINDOWS CONTAINER."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Re-creating and booting Windows."
$COMPOSE_COMMAND --file "$COMPOSE_PATH" down &>/dev/null && $COMPOSE_COMMAND --file "$COMPOSE_PATH" up -d &>/dev/null
NEEDED_BOOT=true
;;
"unknown")
EXIT_STATUS=$EC_UNKNOWN
@@ -464,6 +514,45 @@ function waCheckContainerRunning() {
# Handle non-zero exit statuses.
[ "$EXIT_STATUS" -ne 0 ] && waThrowExit "$EXIT_STATUS"
# Wait for container to be fully ready
if [[ "$CONTAINER_STATE" == "created" || "$CONTAINER_STATE" == "exited" || "$CONTAINER_STATE" == "dead" || "$CONTAINER_STATE" == "restarting" ]]; then
dprint "WAITING FOR CONTAINER TO BE FULLY READY..."
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Waiting for Windows to be ready..."
TIME_ELAPSED=0
while (( TIME_ELAPSED < BOOT_TIMEOUT )); do
# Check if container is running
if [[ $("$WAFLAVOR" inspect --format='{{.State.Status}}' "$CONTAINER_NAME") == "running" ]]; then
# Try to connect to RDP port to verify it's ready
if timeout 1 bash -c ">/dev/tcp/$RDP_IP/$RDP_PORT" 2>/dev/null; then
dprint "CONTAINER IS READY"
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Windows is ready."
# Add a delay after Windows is ready
if [ "$NEEDED_BOOT" = "true" ]; then
sleep 10
fi
break
fi
fi
sleep 5
TIME_ELAPSED=$((TIME_ELAPSED + 5))
# Show progress every 30 seconds
if (( TIME_ELAPSED % 30 == 0 )); then
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Still waiting for Windows to be ready... ($TIME_ELAPSED seconds elapsed)"
fi
done
# If we timed out waiting for the container
if (( TIME_ELAPSED >= BOOT_TIMEOUT )); then
dprint "TIMEOUT WAITING FOR CONTAINER TO BE READY"
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Timeout waiting for Windows to be ready. Please try again."
waThrowExit $EC_FAIL_START
fi
fi
}
# Name: 'waCheckPortOpen'

22
flake.lock generated
View File

@@ -32,13 +32,28 @@
"type": "github"
}
},
"nix-filter": {
"locked": {
"lastModified": 1731533336,
"narHash": "sha256-oRam5PS1vcrr5UPgALW0eo1m/5/pls27Z/pabHNy2Ms=",
"owner": "numtide",
"repo": "nix-filter",
"rev": "f7653272fd234696ae94229839a99b73c9ab7de0",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "nix-filter",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1724819573,
"narHash": "sha256-GnR7/ibgIH1vhoy8cYdmXE6iyZqKqFxQSVkFgosBh6w=",
"lastModified": 1751984180,
"narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "71e91c409d1e654808b2621f28a327acfdad8dc2",
"rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0",
"type": "github"
},
"original": {
@@ -52,6 +67,7 @@
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nix-filter": "nix-filter",
"nixpkgs": "nixpkgs"
}
},

View File

@@ -1,17 +1,29 @@
{
description = "WinApps Nix packages & NixOS module";
description = "WinApps Nix packages";
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";
nix-filter.url = "github:numtide/nix-filter";
};
nixConfig = {
extra-substituters = [
"https://cache.garnix.io"
];
extra-trusted-public-keys = [
"cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="
];
};
outputs =
{
nixpkgs,
flake-utils,
nix-filter,
...
}:
flake-utils.lib.eachDefaultSystem (
@@ -19,11 +31,13 @@
let
pkgs = import nixpkgs { inherit system; };
in
{
rec {
formatter = pkgs.nixfmt-rfc-style;
packages.winapps = pkgs.callPackage ./packages/winapps { };
packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher { };
packages.winapps = pkgs.callPackage ./packages/winapps { inherit nix-filter; };
packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher {
inherit (packages) winapps;
};
}
);
}

View File

@@ -4,8 +4,8 @@
fetchFromGitHub,
makeWrapper,
makeDesktopItem,
callPackage,
yad,
winapps ? throw "Pass in the winapps package",
...
}:
let
@@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
yad
(callPackage ../winapps { })
winapps
];
patches = [ ./WinApps-Launcher.patch ];

View File

@@ -1,33 +1,36 @@
{
stdenv,
lib,
fetchFromGitHub,
makeWrapper,
freerdp3,
freerdp,
dialog,
libnotify,
netcat,
iproute2,
writeShellScriptBin,
nix-filter ? throw "Pass github:numtide/nix-filter as an argument!",
...
}:
let
rev = "e48d50ff7879ed43bb4e4153d463aa0bf127b278";
hash = "sha256-RAP5QpACWIsuVLtwKWpUwmJ2G4HJpkEwdxOjMVY6JM0=";
in
stdenv.mkDerivation rec {
pname = "winapps";
version = "0-unstable-2025-07-10";
version = "0-unstable-2025-07-02";
src = fetchFromGitHub {
owner = "winapps-org";
repo = "winapps";
inherit rev hash;
src = nix-filter {
root = ./../..;
include = [
"apps"
"install"
"bin"
"icons"
"LICENSE.md"
"COPYRIGHT.md"
"setup.sh"
];
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
freerdp3
(writeShellScriptBin "xfreerdp3" ''${lib.getExe' freerdp "xfreerdp"} "$@"'')
libnotify
dialog
netcat