diff --git a/README.md b/README.md index 7c05420..8269b0e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # winapps -The winapps main project + +The winapps main project Originally created by fmstrat https://github.com/Fmstrat/winapps/ Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration for right clicking on files of specific mime types to open them. @@ -7,7 +8,9 @@ Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNO ## How it works + WinApps was created as an easy, one command way to include apps running inside a VM (or on any RDP server) directly into GNOME as if they were native applications. WinApps works by: + - Running a Windows RDP server in a background VM container - Checking the RDP server for installed applications such as Microsoft Office - If those programs are installed, it creates shortcuts leveraging FreeRDP for both the CLI and the GNOME tray @@ -15,9 +18,11 @@ WinApps was created as an easy, one command way to include apps running inside a - You can right click on any files in your home directory to open with an application, too ## Currently supported applications -### WinApps supports ***ANY*** installed application on your system. + +### WinApps supports **_ANY_** installed application on your system. It does this by: + 1. Scanning your system for offically configured applications (below) 2. Scanning your system for any other EXE files with install records in the Windows Registry @@ -75,6 +80,7 @@ Note: The officially configured application list below is fueled by the communit ## Installation ### Step 1: Set up a Windows Virtual Machine + The best solution for running a VM as a subsystem for WinApps would be KVM. KVM is a CPU and memory-efficient virtualization engine bundled with most major Linux distributions. To set up the VM for WinApps, follow this guide: - [Creating a Virtual Machine in KVM](docs/KVM.md) @@ -82,8 +88,10 @@ The best solution for running a VM as a subsystem for WinApps would be KVM. KVM If you already have a Virtual Machine or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the VM's Windows Registry. If this VM is in KVM and you want to use auto-IP detection, you will need to name the machine `RDPWindows` (auto-IP detection not supported for non-KVM VMs). Directions for both of these can be found in the guide linked above. ### Step 2: Download the repo and prerequisites + To get things going, use: -``` bash + +```bash sudo apt install -y freerdp2-x11 git clone https://github.com/winapps-org/winapps.git cd winapps @@ -94,8 +102,10 @@ cd winapps > You can find nightly builds here: https://github.com/FreeRDP/FreeRDP/wiki/Prebuilds ### Step 3: Creating your WinApps configuration file + You will need to create a `~/.config/winapps/winapps.conf` configuration file with the following information in it: -``` bash + +```bash RDP_USER="MyWindowsUser" RDP_PASS="MyWindowsPassword" #RDP_DOMAIN="MYDOMAIN" @@ -104,10 +114,13 @@ RDP_PASS="MyWindowsPassword" #RDP_FLAGS="" #MULTIMON="true" #DEBUG="true" +#FREERDP_COMMAND="xfreerdp" ``` + The username and password should be a full user account and password, such as the one created when setting up Windows or a domain user. It cannot be a user/PIN combination as those are not valid for RDP access. Options: + - When using a pre-existing non-KVM RDP server, you must use the `RDP_IP` to specify it's location - If you are running a VM in KVM with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the right local IP - For domain users, you can uncomment and change `RDP_DOMAIN` @@ -115,15 +128,20 @@ Options: - To add flags to the FreeRDP call, such as `/audio-mode:1` to pass in a mic, use the `RDP_FLAGS` configuration option - For multi-monitor setups, you can try enabling `MULTIMON`, however if you get a black screen (FreeRDP bug) you will need to revert back - If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log` +- If you are on a system, where the command for freeredp is not xfreerdp, change `FREERDP_COMMAND` to it. ### Step 4: Run the WinApps installer + Lastly, check that FreeRDP can connect with: + ``` bin/winapps check ``` + You will see output from FreeRDP, as well as potentially have to accept the initial certificate. After that, a Windows Explorer window should pop up. You can close this window and press `Ctrl-C` to cancel out of FreeRDP. If this step fails, try restarting the VM, or your problem could be related to: + - You need to accept the security cert the first time you connect (with 'check') - Not enabling RDP in the Windows VM - Not being able to connect to the IP of the VM @@ -131,16 +149,19 @@ If this step fails, try restarting the VM, or your problem could be related to: - Not merging `install/RDPApps.reg` into the VM Then the final step is to run the installer which will prompt you for a system or user install: -``` bash + +```bash ./installer.sh ``` + This will take you through the following process: - ## Adding pre-defined applications + Adding applications with custom icons and mime types to the installer is easy. Simply copy one of the application configurations in the `apps` folder, and: + - Edit the variables for the application - Replace the `icon.svg` with an SVG for the application (appropriately licensed) - Re-run the installer @@ -149,21 +170,27 @@ Adding applications with custom icons and mime types to the installer is easy. S When running the installer, it will check for if any configured apps are installed, and if they are it will create the appropriate shortcuts on the host OS. ## Running applications manually + WinApps offers a manual mode for running applications that are not configured. This is completed with the `manual` flag. Executables that are in the path do not require full path definition. -``` bash + +```bash ./bin/winapps manual "C:\my\directory\executableNotInPath.exe" ./bin/winapps manual executableInPath.exe ``` ## Checking for new application support + The installer can be run multiple times, so simply run the below again and it will remove any current installations and update for the latest applications. -``` bash + +```bash ./installer.sh ``` ## Optional installer command line arguments + The following optional commands can be used to manage your application configurations without prompts: -``` bash + +```bash ./installer.sh --user # Configure applications for the current user ./installer.sh --system # Configure applications for the entire system ./installer.sh --user --uninstall # Remove all configured applications for the current user @@ -171,9 +198,9 @@ The following optional commands can be used to manage your application configura ``` ## Shout outs + - Some icons pulled from - - Fluent UI React - Icons under [MIT License](https://github.com/Fmstrat/fluent-ui-react/blob/master/LICENSE.md) + - Fluent UI React - Icons under [MIT License](https://github.com/Fmstrat/fluent-ui-react/blob/master/LICENSE.md) - Fluent UI - Icons under [MIT License](https://github.com/Fmstrat/fluentui/blob/master/LICENSE) with [restricted use](https://static2.sharepointonline.com/files/fabric/assets/microsoft_fabric_assets_license_agreement_nov_2019.pdf) - PKief's VSCode Material Icon Theme - Icons under [MIT License](https://github.com/Fmstrat/vscode-material-icon-theme/blob/master/LICENSE.md) - DiemenDesign's LibreICONS - Icons under [MIT License](https://github.com/Fmstrat/LibreICONS/blob/master/LICENSE) - diff --git a/apps/iexplorer/info b/apps/iexplorer/info index 7de8b24..2da385e 100644 --- a/apps/iexplorer/info +++ b/apps/iexplorer/info @@ -8,7 +8,7 @@ FULL_NAME="Internet Explorer" WIN_EXECUTABLE="C:\Program Files\Internet Explorer\iexplore.exe" # GNOME categories -CATEGORIES="WinApps;Office" +CATEGORIES="WinApps;Network;WebBrowser;" # GNOME mimetypes MIME_TYPES="text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall;" diff --git a/bin/winapps b/bin/winapps index cecb079..0f24c86 100755 --- a/bin/winapps +++ b/bin/winapps @@ -4,7 +4,6 @@ if [ ! -f "${HOME}/.config/winapps/winapps.conf" ] && [ ! -f "${HOME}/.winapps" echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..." exit fi - DIR="$(dirname "$(readlink -f "$0")")" RUN="$(date)-${RANDOM}" @@ -22,7 +21,7 @@ fi function dprint() { if [ "${DEBUG}" = "true" ]; then - echo "[${RUN}] ${1}" >> "${HOME}/.local/share/winapps/winapps.log" + echo "[${RUN}] ${1}" >>"${HOME}/.local/share/winapps/winapps.log" fi } @@ -34,52 +33,59 @@ if [ -f "${HOME}/.local/share/winapps/run" ]; then touch "${HOME}/.local/share/winapps/run" THIS_RUN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run") dprint "THIS_RUN:${THIS_RUN}" - if (( $THIS_RUN - $LAST_RAN < 2 )); then + if (($THIS_RUN - $LAST_RAN < 2)); then exit fi else touch "${HOME}/.local/share/winapps/run" fi -if [ -z "$(which xfreerdp)" ]; then - echo "You need xfreerdp!" - echo " sudo apt-get install -y freerdp2-x11" - exit +if [ -z "${FREERDP_COMMAND}" ]; then + if command -v xfreerdp &> /dev/null + then + FREERDP_COMMAND="xfreerdp" + elif command -v xfreerdp3 &> /dev/null + then + FREERDP_COMMAND="xfreerdp3" + fi +else + dprint "Using custom freerdp command ${FREERDP_COMMAND}" fi if [ -z "${RDP_IP}" ]; then - if [ -z "$(groups |grep libvirt)" ]; then + if [ -z "$(groups | grep libvirt)" ]; then echo "You are not a member of the libvirt group. Run the below then reboot." echo ' sudo usermod -a -G libvirt $(whoami)' echo ' sudo usermod -a -G kvm $(whoami)' exit fi - if [ -z "$(virsh list |grep RDPWindows)" ]; then + if [ -z "$(virsh list | grep RDPWindows)" ]; then echo "RDPWindows is not running, run:" echo " virsh start RDPWindows" exit fi - RDP_IP=$(virsh net-dhcp-leases default |grep RDPWindows |awk '{print $5}') + RDP_IP=$(virsh net-dhcp-leases default | grep RDPWindows | awk '{print $5}') RDP_IP=${RDP_IP%%\/*} + fi dprint "1:${1}" dprint "2:${2}" dprint "@:${@}" -MULTI_FLAG="span" +MULTI_FLAG="+span" if [ "${MULTIMON}" = "true" ]; then - MULTI_FLAG="multimon" + MULTI_FLAG="/multimon" fi if [ "${1}" = "windows" ]; then - xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +auto-reconnect +home-drive /wm-class:"Microsoft Windows" 1> /dev/null 2>&1 & + $FREERDP_COMMAND ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /scale:${RDP_SCALE} +dynamic-resolution +auto-reconnect +home-drive /wm-class:"Microsoft Windows" /v:${RDP_IP} 1>/dev/null 2>&1 & elif [ "${1}" = "check" ]; then dprint "CHECK" - xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"explorer.exe" + $FREERDP_COMMAND ${RDP_FLAGS} /d:${RDP_DOMAIN} /u:${RDP_USER} /p:${RDP_PASS} /scale:${RDP_SCALE} +auto-reconnect +home-drive -wallpaper +dynamic-resolution ${MULTI_FLAG} /app:program:"explorer.exe" /v:${RDP_IP} elif [ "${1}" = "manual" ]; then dprint "MANUAL:${2}" - xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"${2}" 1> /dev/null 2>&1 & + $FREERDP_COMMAND ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /scale:${RDP_SCALE} +auto-reconnect +home-drive +dynamic-resolution ${MULTI_FLAG} /app:programm:"${2}" /v:${RDP_IP} 1>/dev/null 2>&1 & elif [ "${1}" != "install" ]; then dprint "DIR:${DIR}" if [ -e "${DIR}/../apps/${1}/info" ]; then @@ -99,9 +105,9 @@ elif [ "${1}" != "install" ]; then dprint "HOME:${HOME}" FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g') dprint "FILE:${FILE}" - xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"\"${FILE}\"" 1> /dev/null 2>&1 & + $FREERDP_COMMAND ${RDP_FLAGS} /d:${RDP_DOMAIN} /u:${RDP_USER} /p:${RDP_PASS} /scale:${RDP_SCALE} +auto-reconnect +clipboard +home-drive -wallpaper +dynamic-resolution ${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:program:"${WIN_EXECUTABLE}",icon:"${ICON}",name:"${FULL_NAME}",cmd:"\"$FILE\"" /v:${RDP_IP} 1>/dev/null 2>&1 & else - xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" 1> /dev/null 2>&1 & + $FREERDP_COMMAND ${RDP_FLAGS} /d:${RDP_DOMAIN} /u:${RDP_USER} /p:${RDP_PASS} /scale:${RDP_SCALE} +auto-reconnect +clipboard +home-drive -wallpaper +dynamic-resolution ${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:program:"${WIN_EXECUTABLE}",icon:"${ICON}",name:"${FULL_NAME}" /v:${RDP_IP} 1>/dev/null 2>&1 & fi fi diff --git a/installer.sh b/installer.sh index 464980b..2072d2d 100755 --- a/installer.sh +++ b/installer.sh @@ -1,6 +1,12 @@ #!/usr/bin/env bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +if ! command -v bc &> /dev/null +then + echo "You need bc!" + exit +fi + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" MAKEDEMO=0 USEDEMO=0 @@ -37,16 +43,16 @@ function waFindInstalled() { cp "${DIR}/install/ExtractPrograms.ps1" ${HOME}/.local/share/winapps/ExtractPrograms.ps1 for F in $(ls "${DIR}/apps"); do . "${DIR}/apps/${F}/info" - echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >> ${HOME}/.local/share/winapps/installed.bat - done; - echo "powershell.exe -ExecutionPolicy Bypass -File \\\\tsclient\\home\\.local\\share\\winapps\\ExtractPrograms.ps1 > \\\\tsclient\home\\.local\\share\\winapps\\detected" >> ${HOME}/.local/share/winapps/installed.bat - echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >> ${HOME}/.local/share/winapps/installed.bat - xfreerdp /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive -wallpaper /span /wm-class:"RDPInstaller" /app:"C:\Windows\System32\cmd.exe" /app-icon:"${DIR}/../icons/windows.svg" /app-cmd:"/C \\\\tsclient\\home\\.local\\share\\winapps\\installed.bat" 1> /dev/null 2>&1 & + echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >>${HOME}/.local/share/winapps/installed.bat + done + echo "powershell.exe -ExecutionPolicy Bypass -File \\\\tsclient\\home\\.local\\share\\winapps\\ExtractPrograms.ps1 > \\\\tsclient\home\\.local\\share\\winapps\\detected" >>${HOME}/.local/share/winapps/installed.bat + echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >>${HOME}/.local/share/winapps/installed.bat + $FREERDP_COMMAND /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" +auto-reconnect +home-drive -wallpaper +span /app:program:"C:\Windows\System32\cmd.exe",cmd:"/C \\\\tsclient\\home\\.local\\share\\winapps\\installed.bat" /v:${RDP_IP} 1>/dev/null 2>&1 & COUNT=0 while [ ! -f "${HOME}/.local/share/winapps/installed" ]; do sleep 5 COUNT=$((COUNT + 1)) - if (( COUNT == 15 )); then + if ((COUNT == 15)); then echo " Finished." echo "" echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:" @@ -75,11 +81,11 @@ function waFindInstalled() { } function waConfigureApp() { - . "${SYS_PATH}/apps/${1}/info" - echo -n " Configuring ${NAME}..." - if [ ${USEDEMO} != 1 ]; then - ${SUDO} rm -f "${APP_PATH}/${1}.desktop" - echo "[Desktop Entry] + . "${SYS_PATH}/apps/${1}/info" + echo -n " Configuring ${NAME}..." + if [ ${USEDEMO} != 1 ]; then + ${SUDO} rm -f "${APP_PATH}/${1}.desktop" + echo "[Desktop Entry] Name=${NAME} Exec=${BIN_PATH}/winapps ${1} %F Terminal=false @@ -89,40 +95,45 @@ StartupWMClass=${FULL_NAME} Comment=${FULL_NAME} Categories=${CATEGORIES} MimeType=${MIME_TYPES} -" |${SUDO} tee "${APP_PATH}/${1}.desktop" > /dev/null - ${SUDO} rm -f "${BIN_PATH}/${1}" - echo "#!/usr/bin/env bash +" | ${SUDO} tee "${APP_PATH}/${1}.desktop" >/dev/null + ${SUDO} rm -f "${BIN_PATH}/${1}" + echo "#!/usr/bin/env bash ${BIN_PATH}/winapps ${1} $@ -" |${SUDO} tee "${BIN_PATH}/${1}" > /dev/null - ${SUDO} chmod a+x "${BIN_PATH}/${1}" - fi - echo " Finished." +" | ${SUDO} tee "${BIN_PATH}/${1}" >/dev/null + ${SUDO} chmod a+x "${BIN_PATH}/${1}" + fi + echo " Finished." } function waConfigureApps() { APPS=() - for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do + for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do . "${DIR}/apps/${F}/info" APPS+=("${FULL_NAME} (${F})") - INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" |tr '[:upper:]' '[:lower:]')") + INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" | tr '[:upper:]' '[:lower:]')") done IFS=$'\n' APPS=($(sort <<<"${APPS[*]}")) unset IFS OPTIONS=("Set up all detected pre-configured applications" "Select which pre-configured applications to set up" "Do not set up any pre-configured applications") - menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}" + + if [ "${INSTALL_TYPE}" != 'User' ]; then + menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}" + else"grep -l -d skip" + menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications? If any web browser is set-up, may be configured as default browser." "${OPTIONS[@]}" + fi if [ "${APP_INSTALL}" = "Select which pre-configured applications to set up" ]; then checkbox_input "Which pre-configured apps would you like to set up?" APPS SELECTED_APPS - echo "" > "${HOME}/.local/share/winapps/installed" + echo "" >"${HOME}/.local/share/winapps/installed" for F in "${SELECTED_APPS[@]}"; do APP="${F##*(}" APP="${APP%%)}" - echo "${APP}" >> "${HOME}/.local/share/winapps/installed" + echo "${APP}" >>"${HOME}/.local/share/winapps/installed" done - fi + fi ${SUDO} cp "${DIR}/bin/winapps" "${BIN_PATH}/winapps" COUNT=0 if [ "${APP_INSTALL}" != "Do not set up any pre-configured applications" ]; then - for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do + for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do COUNT=$((COUNT + 1)) ${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps" waConfigureApp "${F}" svg @@ -130,7 +141,22 @@ function waConfigureApps() { fi rm -f "${HOME}/.local/share/winapps/installed" rm -f "${HOME}/.local/share/winapps/installed.bat" - if (( $COUNT == 0 )); then + if (($COUNT == 0)); then + echo " No configured applications." + fi +} + +function waConfigureAppsAllOfficiallySupported(){ + ${SUDO} cp "${DIR}/bin/winapps" "${BIN_PATH}/winapps" + COUNT=0 + for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do + COUNT=$((COUNT + 1)) + ${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps" + waConfigureApp "${F}" svg + done + rm -f "${HOME}/.local/share/winapps/installed" + rm -f "${HOME}/.local/share/winapps/installed.bat" + if (($COUNT == 0)); then echo " No configured applications." fi } @@ -142,8 +168,12 @@ function waConfigureDetectedApps() { APPS=() for I in "${!NAMES[@]}"; do EXE=${EXES[$I]##*\\} - EXE_LOWER=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') - if ( dlm=$'\x1F' ; IFS="$dlm" ; [[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm${EXE_LOWER}$dlm"* ]] ) ; then + EXE_LOWER=$(echo "${EXE}" | tr '[:upper:]' '[:lower:]') + if ( + dlm=$'\x1F' + IFS="$dlm" + [[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm${EXE_LOWER}$dlm"* ]] + ); then APPS+=("${NAMES[$I]} (${EXE})") fi done @@ -153,17 +183,17 @@ function waConfigureDetectedApps() { menuFromArr APP_INSTALL "How would you like to handle other detected applications?" "${OPTIONS[@]}" if [ "${APP_INSTALL}" = "Select which applications to set up" ]; then checkbox_input "Which other apps would you like to set up?" APPS SELECTED_APPS - echo "" > "${HOME}/.local/share/winapps/installed" + echo "" >"${HOME}/.local/share/winapps/installed" for F in "${SELECTED_APPS[@]}"; do EXE="${F##*(}" EXE="${EXE%%)}" APP="${F% (*}" - echo "${EXE}|${APP}" >> "${HOME}/.local/share/winapps/installed" + echo "${EXE}|${APP}" >>"${HOME}/.local/share/winapps/installed" done elif [ "${APP_INSTALL}" = "Set up all detected applications" ]; then for I in "${!EXES[@]}"; do EXE=${EXES[$I]##*\\} - echo "${EXE}|${NAMES[$I]}" >> "${HOME}/.local/share/winapps/installed" + echo "${EXE}|${NAMES[$I]}" >>"${HOME}/.local/share/winapps/installed" done fi COUNT=0 @@ -173,7 +203,7 @@ function waConfigureDetectedApps() { NAME="${LINE#*|}" for I in "${!NAMES[@]}"; do if [ "${NAME}" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\${EXE}" ]]; then - EXE=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') + EXE=$(echo "${EXE}" | tr '[:upper:]' '[:lower:]') ${SUDO} mkdir -p "${SYS_PATH}/apps/${EXE}" echo "# GNOME shortcut name NAME=\"${NAME}\" @@ -189,23 +219,22 @@ CATEGORIES=\"WinApps\" # GNOME mimetypes MIME_TYPES=\"\" -" | sudo tee "${SYS_PATH}/apps/${EXE}/info" > /dev/null - echo "${ICONS[$I]}" | base64 -d | sudo tee "${SYS_PATH}/apps/${EXE}/icon.ico" > /dev/null +" | sudo tee "${SYS_PATH}/apps/${EXE}/info" >/dev/null + echo "${ICONS[$I]}" | base64 -d | sudo tee "${SYS_PATH}/apps/${EXE}/icon.ico" >/dev/null waConfigureApp "${EXE}" ico COUNT=$((COUNT + 1)) fi done - done < "${HOME}/.local/share/winapps/installed" + done <"${HOME}/.local/share/winapps/installed" rm -f "${HOME}/.local/share/winapps/installed" fi rm -f "${HOME}/.local/share/winapps/installed.bat" - if (( $COUNT == 0 )); then + if (($COUNT == 0)); then echo " No configured applications." fi fi } - function waConfigureWindows() { echo -n " Configuring Windows..." if [ ${USEDEMO} != 1 ]; then @@ -218,14 +247,14 @@ Exec=${BIN_PATH}/winapps windows %F Terminal=false Type=Application Icon=${SYS_PATH}/icons/windows.svg -StartupWMClass=Micorosoft Windows -Comment=Micorosoft Windows +StartupWMClass=Microsoft Windows +Comment=Microsoft Windows Categories=Windows -" |${SUDO} tee "${APP_PATH}/windows.desktop" > /dev/null +" | ${SUDO} tee "${APP_PATH}/windows.desktop" >/dev/null ${SUDO} rm -f "${BIN_PATH}/windows" echo "#!/usr/bin/env bash ${BIN_PATH}/winapps windows -" |${SUDO} tee "/${BIN_PATH}/windows" > /dev/null +" | ${SUDO} tee "/${BIN_PATH}/windows" >/dev/null ${SUDO} chmod a+x "${BIN_PATH}/windows" fi echo " Finished." @@ -234,12 +263,12 @@ ${BIN_PATH}/winapps windows function waUninstallUser() { rm -f "${HOME}/.local/bin/winapps" rm -rf "${HOME}/.local/share/winapps" - for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"*); do + for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"* -s); do echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." done - for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"*); do + for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"* -s); do echo -n " Removing ${F}..." ${SUDO} rm ${F} echo " Finished." @@ -249,7 +278,7 @@ function waUninstallUser() { function waUninstallSystem() { ${SUDO} rm -f "/usr/local/bin/winapps" ${SUDO} rm -rf "/usr/local/share/winapps" - for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"*); do + for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"* -s); do if [ -z "${SUDO}" ]; then waNoSudo fi @@ -257,7 +286,7 @@ function waUninstallSystem() { ${SUDO} rm ${F} echo " Finished." done - for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"*); do + for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"* -s); do if [ -z "${SUDO}" ]; then waNoSudo fi @@ -283,19 +312,32 @@ if [ "${INSTALL_TYPE}" = 'User' ]; then BIN_PATH="${HOME}/.local/bin" APP_PATH="${HOME}/.local/share/applications" SYS_PATH="${HOME}/.local/share/winapps" + mkdir -p $BIN_PATH + mkdir -p $APP_PATH + mkdir -p $SYS_PATH if [ -n "${2}" ]; then if [ "${2}" = '--uninstall' ]; then # Uninstall echo "Uninstalling..." waUninstallUser exit + elif [ "${2}" = '--setupAllOfficiallySupportedApps' ]; then + echo "Setting up All Officially Supported Apps " + echo "Removing any old configurations..." + waUninstallUser + waUninstallSystem + waInstall + waFindInstalled + waConfigureWindows + waConfigureAppsAllOfficiallySupported + exit else usage fi fi elif [ "${INSTALL_TYPE}" = 'System' ]; then SUDO="sudo" - sudo ls > /dev/null + sudo ls >/dev/null BIN_PATH="/usr/local/bin" APP_PATH="/usr/share/applications" SYS_PATH="/usr/local/share/winapps" @@ -305,6 +347,18 @@ elif [ "${INSTALL_TYPE}" = 'System' ]; then echo "Uninstalling..." waUninstallSystem exit + elif [ "${2}" = '--setupAllOfficiallySupportedApps' ]; then + echo "Setting up All Officially Supported Apps " + echo "Removing any old configurations..." + waUninstallUser + waUninstallSystem + + echo "Installing..." + waInstall + waFindInstalled + waConfigureWindows + waConfigureAppsAllOfficiallySupported + exit else usage fi @@ -330,4 +384,4 @@ waConfigureWindows waConfigureApps waConfigureDetectedApps -echo "Installation complete." \ No newline at end of file +echo "Installation complete."