mirror of
				https://github.com/winapps-org/winapps.git
				synced 2025-11-03 21:04:04 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			dd9a85aae1
			...
			feat-optim
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					dcd662dc06 | ||
| 
						 | 
					a317ba41f4 | ||
| 
						 | 
					fc3e5e0839 | ||
| 
						 | 
					b42449459e | 
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							@@ -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.**
 | 
			
		||||
@@ -404,18 +403,9 @@ 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'
 | 
			
		||||
# DEFAULT VALUE: '/cert:tofu /sound /microphone +home-drive'
 | 
			
		||||
# VALID VALUES: See https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown
 | 
			
		||||
RDP_FLAGS="/cert:tofu /sound /microphone"
 | 
			
		||||
 | 
			
		||||
# [MULTIPLE MONITORS]
 | 
			
		||||
# NOTES:
 | 
			
		||||
# - If enabled, a FreeRDP bug *might* produce a black screen.
 | 
			
		||||
# DEFAULT VALUE: 'false'
 | 
			
		||||
# VALID VALUES:
 | 
			
		||||
# - 'true'
 | 
			
		||||
# - 'false'
 | 
			
		||||
MULTIMON="false"
 | 
			
		||||
RDP_FLAGS="/cert:tofu /sound /microphone +home-drive"
 | 
			
		||||
 | 
			
		||||
# [DEBUG WINAPPS]
 | 
			
		||||
# NOTES:
 | 
			
		||||
@@ -492,7 +482,7 @@ APP_SCAN_TIMEOUT="60"
 | 
			
		||||
- For domain users, you can uncomment and change `RDP_DOMAIN`.
 | 
			
		||||
- On high-resolution (UHD) displays, you can set `RDP_SCALE` to the scale you would like to use (100, 140 or 180).
 | 
			
		||||
- To add additional flags to the FreeRDP call (e.g. `/prevent-session-lock 120`), uncomment and use the `RDP_FLAGS` configuration option.
 | 
			
		||||
- For multi-monitor setups, you can try enabling `MULTIMON`. A FreeRDP bug may result in a black screen however, in which case you should revert this change.
 | 
			
		||||
- For multi-monitor setups, you can try adding `/multimon` to `RDP_FLAGS`. A FreeRDP bug may result in a black screen however, in which case you should revert this change.
 | 
			
		||||
- 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`.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
							
								
								
									
										25
									
								
								bin/winapps
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								bin/winapps
									
									
									
									
									
								
							@@ -49,9 +49,7 @@ REMOVABLE_MEDIA=""
 | 
			
		||||
RDP_SCALE=100
 | 
			
		||||
AUTOPAUSE="off"
 | 
			
		||||
AUTOPAUSE_TIME="300"
 | 
			
		||||
MULTIMON="false"
 | 
			
		||||
DEBUG="true"
 | 
			
		||||
MULTI_FLAG=""
 | 
			
		||||
 | 
			
		||||
# OTHER
 | 
			
		||||
FREERDP_PID=-1
 | 
			
		||||
@@ -212,9 +210,6 @@ function waLoadConfig() {
 | 
			
		||||
        waThrowExit $EC_MISSING_CONFIG
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Update 'MULTI_FLAG' based on 'MULTIMON'.
 | 
			
		||||
    MULTI_FLAG=$([[ $MULTIMON == "true" ]] && echo "/multimon" || echo "+span")
 | 
			
		||||
 | 
			
		||||
    # Update $RDP_SCALE.
 | 
			
		||||
    waFixScale
 | 
			
		||||
    # Update when $REMOVABLE_MEDIA is null
 | 
			
		||||
@@ -521,11 +516,8 @@ function waRunCommand() {
 | 
			
		||||
            /u:"$RDP_USER" \
 | 
			
		||||
            /p:"$RDP_PASS" \
 | 
			
		||||
            /scale:"$RDP_SCALE" \
 | 
			
		||||
            +dynamic-resolution \
 | 
			
		||||
            +auto-reconnect \
 | 
			
		||||
            +home-drive \
 | 
			
		||||
            +clipboard \
 | 
			
		||||
            -wallpaper \
 | 
			
		||||
            +dynamic-resolution \
 | 
			
		||||
            /wm-class:"Microsoft Windows" \
 | 
			
		||||
            /t:"Windows RDP Session [$RDP_IP]" \
 | 
			
		||||
            /v:"$RDP_IP" &>/dev/null &
 | 
			
		||||
@@ -540,12 +532,7 @@ function waRunCommand() {
 | 
			
		||||
            /u:"$RDP_USER" \
 | 
			
		||||
            /p:"$RDP_PASS" \
 | 
			
		||||
            /scale:"$RDP_SCALE" \
 | 
			
		||||
            +dynamic-resolution \
 | 
			
		||||
            +auto-reconnect \
 | 
			
		||||
            +home-drive \
 | 
			
		||||
            +clipboard \
 | 
			
		||||
            -wallpaper \
 | 
			
		||||
            "$MULTI_FLAG" \
 | 
			
		||||
            /app:program:"$2" \
 | 
			
		||||
            /v:"$RDP_IP" &>/dev/null &
 | 
			
		||||
 | 
			
		||||
@@ -577,12 +564,7 @@ function waRunCommand() {
 | 
			
		||||
                /u:"$RDP_USER" \
 | 
			
		||||
                /p:"$RDP_PASS" \
 | 
			
		||||
                /scale:"$RDP_SCALE" \
 | 
			
		||||
                +dynamic-resolution \
 | 
			
		||||
                +auto-reconnect \
 | 
			
		||||
                +home-drive \
 | 
			
		||||
                +clipboard \
 | 
			
		||||
                -wallpaper \
 | 
			
		||||
                "$MULTI_FLAG" \
 | 
			
		||||
                /wm-class:"$FULL_NAME" \
 | 
			
		||||
                /app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:"$FULL_NAME" \
 | 
			
		||||
                /v:"$RDP_IP" &>/dev/null &
 | 
			
		||||
@@ -603,13 +585,8 @@ function waRunCommand() {
 | 
			
		||||
                /u:"$RDP_USER" \
 | 
			
		||||
                /p:"$RDP_PASS" \
 | 
			
		||||
                /scale:"$RDP_SCALE" \
 | 
			
		||||
                +dynamic-resolution \
 | 
			
		||||
                +auto-reconnect \
 | 
			
		||||
                +home-drive \
 | 
			
		||||
                +clipboard \
 | 
			
		||||
                /drive:media,"$REMOVABLE_MEDIA" \
 | 
			
		||||
                -wallpaper \
 | 
			
		||||
                "$MULTI_FLAG" \
 | 
			
		||||
                /wm-class:"$FULL_NAME" \
 | 
			
		||||
                /app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:$"FULL_NAME",cmd:\""$FILE_PATH"\" \
 | 
			
		||||
                /v:"$RDP_IP" &>/dev/null &
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,12 @@
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
let
 | 
			
		||||
  rev = "e2e9fd9b7b66bd1432c2a7186017da5c281d5b9e";
 | 
			
		||||
  hash = "sha256-N6ArgdiJyhWNALqpRxLR6RDDMsiqEf2RxWLQ2z7T23Y=";
 | 
			
		||||
  rev = "2b2f4cea698096829fbd1c3c15970034a6f53261";
 | 
			
		||||
  hash = "sha256-km8q3IL5sETbFsscNy4dDxYTytuKPJQJY81p7tSk63A=";
 | 
			
		||||
in
 | 
			
		||||
stdenv.mkDerivation rec {
 | 
			
		||||
  pname = "winapps";
 | 
			
		||||
  version = "0-unstable-2025-06-10";
 | 
			
		||||
  version = "0-unstable-2025-06-05";
 | 
			
		||||
 | 
			
		||||
  src = fetchFromGitHub {
 | 
			
		||||
    owner = "winapps-org";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								setup.sh
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								setup.sh
									
									
									
									
									
								
							@@ -92,10 +92,9 @@ 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.
 | 
			
		||||
@@ -1047,9 +1046,6 @@ function waCheckRDPAccess() {
 | 
			
		||||
        /p:"$RDP_PASS" \
 | 
			
		||||
        /scale:"$RDP_SCALE" \
 | 
			
		||||
        +auto-reconnect \
 | 
			
		||||
        +home-drive \
 | 
			
		||||
        -wallpaper \
 | 
			
		||||
        +dynamic-resolution \
 | 
			
		||||
        /app:program:"C:\Windows\System32\cmd.exe",cmd:"/C type NUL > $TEST_PATH_WIN && tsdiscon" \
 | 
			
		||||
        /v:"$RDP_IP" &>"$FREERDP_LOG" &
 | 
			
		||||
 | 
			
		||||
@@ -1142,10 +1138,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)
 | 
			
		||||
@@ -1181,9 +1173,6 @@ function waFindInstalled() {
 | 
			
		||||
        /p:"$RDP_PASS" \
 | 
			
		||||
        /scale:"$RDP_SCALE" \
 | 
			
		||||
        +auto-reconnect \
 | 
			
		||||
        +home-drive \
 | 
			
		||||
        -wallpaper \
 | 
			
		||||
        +dynamic-resolution \
 | 
			
		||||
        /app:program:"C:\Windows\System32\cmd.exe",cmd:"/C "$BATCH_SCRIPT_PATH_WIN"" \
 | 
			
		||||
        /v:"$RDP_IP" &>"$FREERDP_LOG" &
 | 
			
		||||
 | 
			
		||||
@@ -1330,9 +1319,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 +1335,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
 | 
			
		||||
@@ -1581,13 +1557,6 @@ function waInstall() {
 | 
			
		||||
    # Check for missing dependencies.
 | 
			
		||||
    waCheckInstallDependencies
 | 
			
		||||
 | 
			
		||||
    # Update $MULTI_FLAG.
 | 
			
		||||
    if [[ $MULTIMON == "true" ]]; then
 | 
			
		||||
        MULTI_FLAG="/multimon"
 | 
			
		||||
    else
 | 
			
		||||
        MULTI_FLAG="+span"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Update $RDP_SCALE.
 | 
			
		||||
    waFixScale
 | 
			
		||||
 | 
			
		||||
@@ -1690,21 +1659,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.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user