Full Code of Fmstrat/winapps for AI

main 5431f94596ba cached
64 files
86.5 KB
27.5k tokens
1 requests
Download .txt
Repository: Fmstrat/winapps
Branch: main
Commit: 5431f94596ba
Files: 64
Total size: 86.5 KB

Directory structure:
gitextract_bxio7kfp/

├── README.md
├── apps/
│   ├── access/
│   │   └── info
│   ├── access-o365/
│   │   └── info
│   ├── access-o365-x86/
│   │   └── info
│   ├── access-x86/
│   │   └── info
│   ├── acrobat-reader-dc/
│   │   └── info
│   ├── acrobat-x-pro/
│   │   └── info
│   ├── adobe-cc/
│   │   └── info
│   ├── aftereffects-cc/
│   │   └── info
│   ├── audition-cc/
│   │   └── info
│   ├── bridge-cc/
│   │   └── info
│   ├── bridge-cs6/
│   │   └── info
│   ├── bridge-cs6-x86/
│   │   └── info
│   ├── cmd/
│   │   └── info
│   ├── excel/
│   │   └── info
│   ├── excel-o365/
│   │   └── info
│   ├── excel-o365-x86/
│   │   └── info
│   ├── excel-x86/
│   │   └── info
│   ├── explorer/
│   │   └── info
│   ├── iexplorer/
│   │   └── info
│   ├── illustrator-cc/
│   │   └── info
│   ├── indesign-cc/
│   │   └── info
│   ├── lightroom-cc/
│   │   └── info
│   ├── onenote/
│   │   └── info
│   ├── onenote-o365/
│   │   └── info
│   ├── onenote-o365-x86/
│   │   └── info
│   ├── onenote-x86/
│   │   └── info
│   ├── outlook/
│   │   └── info
│   ├── outlook-o365/
│   │   └── info
│   ├── outlook-o365-x86/
│   │   └── info
│   ├── outlook-x86/
│   │   └── info
│   ├── photoshop-cc/
│   │   └── info
│   ├── photoshop-cs6/
│   │   └── info
│   ├── photoshop-cs6-x86/
│   │   └── info
│   ├── powerpoint/
│   │   └── info
│   ├── powerpoint-o365/
│   │   └── info
│   ├── powerpoint-o365-x86/
│   │   └── info
│   ├── powerpoint-x86/
│   │   └── info
│   ├── powershell/
│   │   └── info
│   ├── powershell-core/
│   │   └── info
│   ├── premiere-pro-cc/
│   │   └── info
│   ├── project/
│   │   └── info
│   ├── project-o365/
│   │   └── info
│   ├── project-o365-x86/
│   │   └── info
│   ├── project-x86/
│   │   └── info
│   ├── publisher/
│   │   └── info
│   ├── publisher-o365/
│   │   └── info
│   ├── publisher-o365-x86/
│   │   └── info
│   ├── publisher-x86/
│   │   └── info
│   ├── vs-community-2019/
│   │   └── info
│   ├── vs-enterprise-2019/
│   │   └── info
│   ├── vs-professional-2019/
│   │   └── info
│   ├── word/
│   │   └── info
│   ├── word-o365/
│   │   └── info
│   ├── word-o365-x86/
│   │   └── info
│   └── word-x86/
│       └── info
├── bin/
│   └── winapps
├── docs/
│   └── KVM.md
├── install/
│   ├── ExtractPrograms.ps1
│   ├── RDPApps.reg
│   └── inquirer.sh
├── installer.sh
└── kvm/
    ├── RDPWindows.qcow2
    └── RDPWindows.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# WinApps for Linux

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.

<img src="demo/demo.gif" width=1000>

***Proud to have made the top spot on [r/linux](https://www.reddit.com/r/linux) on launch day.***

## 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
- Files in your home directory are accessible via the `\\tsclient\home` mount inside the VM
- 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.

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

Any officially configured applications will have support for high-resolution icons and mime types for automatically detecting what files can be opened by each application. Any other detected executable files will leverage the icons pulled from the EXE.

Note: The officially configured application list below is fueled by the community, and therefore some apps may be untested by the WinApps team.

<table cellpadding="10" cellspacing="0" border="0">
  <tr>
    <td><img src="apps/acrobat-x-pro/icon.svg" width="100"></td><td>Adobe Acrobat Pro<br>(X)</td>
    <td><img src="apps/acrobat-reader-dc/icon.svg" width="100"></td><td>Adobe Acrobat Reader<br>(DC)</td>
  </tr>
  <tr>
    <td><img src="apps/aftereffects-cc/icon.svg" width="100"></td><td>Adobe After Effects<br>(CC)</td>
    <td><img src="apps/audition-cc/icon.svg" width="100"></td><td>Adobe Audition<br>(CC)</td>
  </tr>
  <tr>
    <td><img src="apps/bridge-cs6/icon.svg" width="100"></td><td>Adobe Bridge<br>(CS6, CC)</td>
    <td><img src="apps/adobe-cc/icon.svg" width="100"></td><td>Adobe Creative Cloud<br>(CC)</td>
  </tr>
  <tr>
    <td><img src="apps/illustrator-cc/icon.svg" width="100"></td><td>Adobe Illustrator<br>(CC)</td>
    <td><img src="apps/indesign-cc/icon.svg" width="100"></td><td>Adobe InDesign<br>(CC)</td>
  </tr>
  <tr>
    <td><img src="apps/lightroom-cc/icon.svg" width="100"></td><td>Adobe Lightroom<br>(CC)</td>
    <td><img src="apps/photoshop-cc/icon.svg" width="100"></td><td>Adobe Photoshop<br>(CS6, CC)</td>
  </tr>
  <tr>
    <td><img src="apps/premiere-pro-cc/icon.svg" width="100"></td><td>Adobe Premiere Pro<br>(CC)</td>
    <td><img src="apps/cmd/icon.svg" width="100"></td><td>Command Prompt<br>(cmd.exe)</td>
  </tr>
  <tr>
    <td><img src="apps/explorer/icon.svg" width="100"></td><td>Explorer<br>(File Manager)</td>
    <td><img src="apps/iexplorer/icon.svg" width="100"></td><td>Internet Explorer<br>(11)</td>
  </tr>
  <tr>
    <td><img src="apps/access/icon.svg" width="100"></td><td>Microsoft Access<br>(2016, 2019, o365)</td>
    <td><img src="apps/excel/icon.svg" width="100"></td><td>Microsoft Excel<br>(2016, 2019, o365)</td>
  </tr>
  <tr>
    <td><img src="apps/word/icon.svg" width="100"></td><td>Microsoft Word<br>(2016, 2019, o365)</td>
    <td><img src="apps/onenote/icon.svg" width="100"></td><td>Microsoft OneNote<br>(2016, 2019, o365)</td>
  </tr>
  <tr>
    <td><img src="apps/outlook/icon.svg" width="100"></td><td>Microsoft Outlook<br>(2016, 2019, o365)</td>
    <td><img src="apps/powerpoint/icon.svg" width="100"></td><td>Microsoft PowerPoint<br>(2016, 2019, o365)</td>
  </tr>
  <tr>
    <td><img src="apps/project/icon.svg" width="100"></td><td>Microsoft Project<br>(2016, 2019, o365)</td>
    <td><img src="apps/publisher/icon.svg" width="100"></td><td>Microsoft Publisher<br>(2016, 2019, o365)</td>
  </tr>
  <tr>
    <td><img src="apps/powershell/icon.svg" width="100"></td><td>Powershell<br>(Standard, Core)</td>
    <td><img src="apps/vs-enterprise-2019/icon.svg" width="100"></td><td>Visual Studio<br>(2019 - Ent|Pro|Com)</td>
  </tr>
  <tr>
    <td><img src="icons/windows.svg" width="100"></td><td>Windows<br>(Full RDP session)</td>
    <td>&nbsp;</td><td>&nbsp;</td>
  </tr>
</table>

## Documentation

Latest documentation available at: [https://nowsci.com/winapps/](https://nowsci.com/winapps/)



================================================
FILE: apps/access/info
================================================
# GNOME shortcut name
NAME="Access"

# Used for descriptions and window class
FULL_NAME="Microsoft Access"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"


================================================
FILE: apps/access-o365/info
================================================
# GNOME shortcut name
NAME="Access"

# Used for descriptions and window class
FULL_NAME="Microsoft Access"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"


================================================
FILE: apps/access-o365-x86/info
================================================
# GNOME shortcut name
NAME="Access"

# Used for descriptions and window class
FULL_NAME="Microsoft Access"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"


================================================
FILE: apps/access-x86/info
================================================
# GNOME shortcut name
NAME="Access"

# Used for descriptions and window class
FULL_NAME="Microsoft Access"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"


================================================
FILE: apps/acrobat-reader-dc/info
================================================
# GNOME shortcut name
NAME="Acrobat Reader DC"

# Used for descriptions and window class
FULL_NAME="Acrobat Reader DC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"

# GNOME categories
CATEGORIES="WinApps;Documents"

# GNOME mimetypes
MIME_TYPES="application/pdf;"


================================================
FILE: apps/acrobat-x-pro/info
================================================
# GNOME shortcut name
NAME="Acrobat X Pro"

# Used for descriptions and window class
FULL_NAME="Acrobat X Pro"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe"

# GNOME categories
CATEGORIES="WinApps;Documents"

# GNOME mimetypes
MIME_TYPES="application/pdf;"


================================================
FILE: apps/adobe-cc/info
================================================
# GNOME shortcut name
NAME="Creative Cloud"

# Used for descriptions and window class
FULL_NAME="Adobe Creative Cloud"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Creative Cloud\ACC\Creative Cloud.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/aftereffects-cc/info
================================================
# GNOME shortcut name
NAME="After Effects CC"

# Used for descriptions and window class
FULL_NAME="Adobe After Effects CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="application/vnd.adobe.aftereffects.project;application/vnd.adobe.aftereffects.template;"


================================================
FILE: apps/audition-cc/info
================================================
# GNOME shortcut name
NAME="Audition CC"

# Used for descriptions and window class
FULL_NAME="Adobe Audition CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Audition 2020\Adobe Audition.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/bridge-cc/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"

# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge CS6 (64 Bit)\Bridge.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/bridge-cs6/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"

# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge 2020\Bridge.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/bridge-cs6-x86/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"

# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Bridge CS6\Bridge.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/cmd/info
================================================
# GNOME shortcut name
NAME="Cmd"

# Used for descriptions and window class
FULL_NAME="Command Prompt"

# The executable inside windows
WIN_EXECUTABLE="C:\Windows\System32\cmd.exe"

# GNOME categories
CATEGORIES="WinApps;Windows"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/excel/info
================================================
# GNOME shortcut name
NAME="Excel"

# Used for descriptions and window class
FULL_NAME="Microsoft Excel"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\EXCEL.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;"


================================================
FILE: apps/excel-o365/info
================================================
# GNOME shortcut name
NAME="Excel"

# Used for descriptions and window class
FULL_NAME="Microsoft Excel"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;"


================================================
FILE: apps/excel-o365-x86/info
================================================
# GNOME shortcut name
NAME="Excel"

# Used for descriptions and window class
FULL_NAME="Microsoft Excel"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;"


================================================
FILE: apps/excel-x86/info
================================================
# GNOME shortcut name
NAME="Excel"

# Used for descriptions and window class
FULL_NAME="Microsoft Excel"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;"


================================================
FILE: apps/explorer/info
================================================
# GNOME shortcut name
NAME="Explorer"

# Used for descriptions and window class
FULL_NAME="Microsoft Explorer"

# The executable inside windows
WIN_EXECUTABLE="C:\Windows\explorer.exe"

# GNOME categories
CATEGORIES="WinApps;Windows"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/iexplorer/info
================================================
# GNOME shortcut name
NAME="Internet Explorer"

# Used for descriptions and window class
FULL_NAME="Internet Explorer"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Internet Explorer\iexplore.exe"

# GNOME categories
CATEGORIES="WinApps;Office"

# 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;"


================================================
FILE: apps/illustrator-cc/info
================================================
# GNOME shortcut name
NAME="Illustrator CC"

# Used for descriptions and window class
FULL_NAME="Adobe Illustrator CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Illustrator 2021\Support Files\Contents\Windows\Illustrator.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="application/illustrator;"


================================================
FILE: apps/indesign-cc/info
================================================
# GNOME shortcut name
NAME="InDesign CC"

# Used for descriptions and window class
FULL_NAME="Adobe InDesign CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe InDesign 2021\InDesign.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="application/x-adobe-indesign-interchange;application/x-adobe-indesign;"


================================================
FILE: apps/lightroom-cc/info
================================================
# GNOME shortcut name
NAME="Lightroom CC"

# Used for descriptions and window class
FULL_NAME="Adobe Lightroom CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Lightroom CC\lightroom.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/onenote/info
================================================
# GNOME shortcut name
NAME="OneNote"

# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\ONENOTE.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msonenote;"


================================================
FILE: apps/onenote-o365/info
================================================
# GNOME shortcut name
NAME="OneNote"

# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msonenote;"


================================================
FILE: apps/onenote-o365-x86/info
================================================
# GNOME shortcut name
NAME="OneNote"

# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msonenote;"


================================================
FILE: apps/onenote-x86/info
================================================
# GNOME shortcut name
NAME="OneNote"

# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\ONENOTE.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msonenote;"


================================================
FILE: apps/outlook/info
================================================
# GNOME shortcut name
NAME="Outlook"

# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\OUTLOOK.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"


================================================
FILE: apps/outlook-o365/info
================================================
# GNOME shortcut name
NAME="Outlook"

# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"


================================================
FILE: apps/outlook-o365-x86/info
================================================
# GNOME shortcut name
NAME="Outlook"

# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"


================================================
FILE: apps/outlook-x86/info
================================================
# GNOME shortcut name
NAME="Outlook"

# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"


================================================
FILE: apps/photoshop-cc/info
================================================
# GNOME shortcut name
NAME="Photoshop CC"

# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/photoshop-cs6/info
================================================
# GNOME shortcut name
NAME="Photoshop CS6"

# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CS6"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/photoshop-cs6-x86/info
================================================
# GNOME shortcut name
NAME="Photoshop CS6"

# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CS6"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Photoshop CS6\Photoshop.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"


================================================
FILE: apps/powerpoint/info
================================================
# GNOME shortcut name
NAME="PowerPoint"

# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\POWERPNT.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;"


================================================
FILE: apps/powerpoint-o365/info
================================================
# GNOME shortcut name
NAME="PowerPoint"

# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\POWERPNT.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;"


================================================
FILE: apps/powerpoint-o365-x86/info
================================================
# GNOME shortcut name
NAME="PowerPoint"

# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\POWERPNT.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;"


================================================
FILE: apps/powerpoint-x86/info
================================================
# GNOME shortcut name
NAME="PowerPoint"

# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;"


================================================
FILE: apps/powershell/info
================================================
# GNOME shortcut name
NAME="Powershell"

# Used for descriptions and window class
FULL_NAME="Microsoft Powershell"

# The executable inside windows
WIN_EXECUTABLE="C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"

# GNOME categories
CATEGORIES="WinApps;Windows"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/powershell-core/info
================================================
# GNOME shortcut name
NAME="Powershell Core"

# Used for descriptions and window class
FULL_NAME="Microsoft Powershell Core"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\PowerShell\7\pwsh.exe"

# GNOME categories
CATEGORIES="WinApps;Windows"

# GNOME mimetypes
MIME_TYPES=""


================================================
FILE: apps/premiere-pro-cc/info
================================================
# GNOME shortcut name
NAME="Premiere Pro CC"

# Used for descriptions and window class
FULL_NAME="Adobe Premiere Pro CC"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Premiere Pro 2020\Adobe Premiere Pro.exe"

# GNOME categories
CATEGORIES="WinApps;Adobe"

# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.premiere;"


================================================
FILE: apps/project/info
================================================
# GNOME shortcut name
NAME="Project"

# Used for descriptions and window class
FULL_NAME="Microsoft Project"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINPROJ.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"


================================================
FILE: apps/project-o365/info
================================================
# GNOME shortcut name
NAME="Project"

# Used for descriptions and window class
FULL_NAME="Microsoft Project"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINPROJ.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"


================================================
FILE: apps/project-o365-x86/info
================================================
# GNOME shortcut name
NAME="Project"

# Used for descriptions and window class
FULL_NAME="Microsoft Project"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINPROJ.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"


================================================
FILE: apps/project-x86/info
================================================
# GNOME shortcut name
NAME="Project"

# Used for descriptions and window class
FULL_NAME="Microsoft Project"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINPROJ.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"


================================================
FILE: apps/publisher/info
================================================
# GNOME shortcut name
NAME="Publisher"

# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSPUB.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"


================================================
FILE: apps/publisher-o365/info
================================================
# GNOME shortcut name
NAME="Publisher"

# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSPUB.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"


================================================
FILE: apps/publisher-o365-x86/info
================================================
# GNOME shortcut name
NAME="Publisher"

# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSPUB.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"


================================================
FILE: apps/publisher-x86/info
================================================
# GNOME shortcut name
NAME="Publisher"

# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSPUB.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"


================================================
FILE: apps/vs-community-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Community"

# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Community"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe"

# GNOME categories
CATEGORIES="WinApps;Code"

# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"

================================================
FILE: apps/vs-enterprise-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Enterprise"

# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Enterprise"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe"

# GNOME categories
CATEGORIES="WinApps;Code"

# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"

================================================
FILE: apps/vs-professional-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Professional"

# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Professional"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.exe"

# GNOME categories
CATEGORIES="WinApps;Code"

# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"

================================================
FILE: apps/word/info
================================================
# GNOME shortcut name
NAME="Word"

# Used for descriptions and window class
FULL_NAME="Microsoft Word"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINWORD.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;"


================================================
FILE: apps/word-o365/info
================================================
# GNOME shortcut name
NAME="Word"

# Used for descriptions and window class
FULL_NAME="Microsoft Word"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;"


================================================
FILE: apps/word-o365-x86/info
================================================
# GNOME shortcut name
NAME="Word"

# Used for descriptions and window class
FULL_NAME="Microsoft Word"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;"


================================================
FILE: apps/word-x86/info
================================================
# GNOME shortcut name
NAME="Word"

# Used for descriptions and window class
FULL_NAME="Microsoft Word"

# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINWORD.EXE"

# GNOME categories
CATEGORIES="WinApps;Office"

# GNOME mimetypes
MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;"


================================================
FILE: bin/winapps
================================================
#!/usr/bin/env bash

if [ ! -f "${HOME}/.config/winapps/winapps.conf" ] && [ ! -f "${HOME}/.winapps" ]; then
	echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..."
	exit
fi

DIR="$(dirname "$(readlink -f "$0")")"
RUN="$(date)-${RANDOM}"

if [ ! -d "${HOME}/.local/share/winapps" ]; then
	mkdir -p "${HOME}/.local/share/winapps"
fi

RDP_SCALE=100

if [ -f "${HOME}/.config/winapps/winapps.conf" ]; then
	. "${HOME}/.config/winapps/winapps.conf"
else
	. "${HOME}/.winapps"
fi

function dprint() {
	if [ "${DEBUG}" = "true" ]; then
		echo "[${RUN}] ${1}" >> "${HOME}/.local/share/winapps/winapps.log"
	fi
}

dprint "START"

if [ -f "${HOME}/.local/share/winapps/run" ]; then
	LAST_RAN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run")
	dprint "LAST_RAN:${LAST_RAN}"
	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
		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
fi

if [ -z "${RDP_IP}" ]; 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
		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=${RDP_IP%%\/*}
fi

dprint "1:${1}"
dprint "2:${2}"
dprint "@:${@}"

MULTI_FLAG="span"
if [ "${MULTIMON}" = "true" ]; then
	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 +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" 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 +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"explorer.exe"
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 +clipboard -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"${2}" 1> /dev/null 2>&1 &
elif [ "${1}" != "install" ]; then
	dprint "DIR:${DIR}"
	if [ -e "${DIR}/../apps/${1}/info" ]; then
		. "${DIR}/../apps/${1}/info"
		ICON="${DIR}/../apps/${1}/icon.svg"
	elif [ -e "${HOME}/.local/share/winapps/apps/${1}/info" ]; then
		. "${HOME}/.local/share/winapps/apps/${1}/info"
		ICON="${HOME}/.local/share/winapps/apps/${1}/icon.svg"
	elif [ -e "/usr/local/share/winapps/apps/${1}/info" ]; then
		. "/usr/local/share/winapps/apps/${1}/info"
		ICON="/usr/local/share/winapps/apps/${1}/icon.svg"
	else
		echo "You need to run 'install.sh' first."
		exit 1
	fi
	if [ -n "${2}" ]; 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 &
	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 &
	fi
fi

dprint "END"


================================================
FILE: docs/KVM.md
================================================
# Creating a Virtual Machine in KVM

Latest documentation available at: https://nowsci.com/#/winapps/kvm/?id=creating-a-virtual-machine-in-kvm

This step-by-step guide will take you through setting up a CPU and memory efficient virtual machine to use with WinApps leveraging KVM, an open-source virtualization software contained in most linux distributions.

## Install KVM
First up, you must install KVM and the Virtual Machine Manager. By installing `virt-manager`, you will get everything you need for your distribution:
```bash
sudo apt-get install -y virt-manager
```

## Download the Windows Professional and KVM VirtIO drivers
You will need Windows 10 Professional (or Enterprise or Server) to run RDP apps, Windows 10 Home will not suffice. You will also need drivers for VirtIO to ensure the best performance and lowest overhead for your system. You can download these at the following links.

Windows 10 ISO: https://www.microsoft.com/en-us/software-download/windows10ISO

KVM VirtIO drivers (for all distros): https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

## Create your virtual machine
The following guide will take you through the setup. If you are an expert user, you may wish to:
- [Define a VM from XML (may not work on all systems)](#define-a-vm-from-xml)
- [Run KVM in user mode](#run-kvm-in-user-mode)

Otherwise, to set up the standard way, open `virt-manager` (Virtual Machines).

![](kvm/00.png)

Next, go to `Edit`->`Preferences`, and check `Enable XML editing`, then click the `Close` button.

![](kvm/01.png)

Now it is time to add a new VM by clicking the `+` button.

![](kvm/02.png)

Choose `Local install media` and click `Forward`.

![](kvm/03.png)

Now select the location of your Windows 10 ISO, and `Automatically detect` the installation.

![](kvm/04.png)

Set your memory and CPUs. We recommend `2` CPUs and `4096MB` for memory. We will be using a Memory Ballooning service, meaning 4096 is the maximum amount of memory the VM will ever use, but will not use this amount except when it is needed.

![](kvm/05.png)

Choose your virtual disk size, keep in mind this is the maximum size the disk will grow to, but it will not take up this space until it needs it.

![](kvm/06.png)

Next, name your machine `RDPWindows` so that WinApps can detect it, and choose to `Customize configuration before install`.

![](kvm/07.png)

After clicking `Finish`, ensure under CPU that `Copy host CPU configuration` is selected, and `Apply`.

**NOTE:** Sometimes this gets turned off after Windows is installed. You should check this option after install as well.

![](kvm/08.png)

Next, go to the `XML` tab, and edit the `<clock>` section to contain:
```xml
<clock offset='localtime'>
  <timer name='hpet' present='yes'/>
  <timer name='hypervclock' present='yes'/>
</clock>
```
Then `Apply`. This will drastically reduce idle CPU usage (from ~25% to ~3%).

![](kvm/09.png)

Next, under Memory, lower the `Current allocation` to the minimum memory the VM should use. We recommend `1024MB`.

![](kvm/10.png)

Under `Boot options`, check `Start virtual machine on host boot up`.

![](kvm/11.png)

For SATA Disk 1, set the `Disk bus` to `VirtIO`.

![](kvm/12.png)

For the NIC, set the `Device model` to `virtio`.

![](kvm/13.png)

Click the `Add Hardware` button in the lower right, and choose `Storage`. For `Device type`, select `CDROM device` and choose the VirtIO driver ISO you downloaded earlier. This will give the Windows 10 Installer access to drivers during the install process. Now click `Finish` to add the new CDROM device.

![](kvm/14.png)

You are now ready to click `Begin Installation`

![](kvm/15.png)

Now move on to installing the virtual machine.

## Install the virtual machine
From here out you will install Windows 10 Professional as you would on any other machine.

![](kvm/16.png)

Once you get to the point of selecting the location for installation, you will see there are no disks available. This is because we need to load the VirtIO driver. Select `Load driver`.

![](kvm/17.png)

The installer will then ask you to specify where the driver is located. Select the `E:\` drive or whichever drive the VirtIO driver ISO is located on.

![](kvm/18.png)

Choose the appropriate driver for the OS you have selected, which is most likely the `w10` driver for Windows 10.

![](kvm/19.png)

You will now see a disk you can select for the installation.

![](kvm/20.png)

Windows will begin to install, and you will likely need to reboot the VM a number times during this process.

![](kvm/21.png)

At some point, you will come to a network screen. This is because the VirtIO drivers for the network have not yet been loaded. Simply click `I don't have internet`.

![](kvm/22.png)

It will confirm your choice, so just choose `Continue with limited setup`.

![](kvm/23.png)

After you get into Windows and login with the user you created during the install. Open up `Explorer` and navigate the `E:\` drive or wherever the VirtIO driver ISO is mounted. Double click the `virt-win-gt-64.exe` file to launch the VirtIO driver installer.

![](kvm/24.png)

Leave everything as default and click `Next` through the installer. This will install device drivers as well as the Memory Ballooning service.

![](kvm/25.png)

Once you finish the driver install, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the `RDPApps.reg` file from the WinApps repo by visiting https://github.com/Fmstrat/winapps/blob/main/install/RDPApps.reg, right clicking on the `Raw` button, and clicking on `Save target as`.

![](kvm/26.png)

Once you have downloaded the registry file, right click on it, and choose `Merge`, then accept any confirmations along the way.

![](kvm/27.png)

Next up, we need to rename the VM so that WinApps can locate it. Go to the start menu and type `About` to bring up the `About your PC` settings.

![](kvm/28.png)

Scroll down and click on `Rename this PC`

![](kvm/29.png)

Rename to `RDPWindows`, and then `Next`, but **do not** restart.

![](kvm/30.png)

Lastly, scroll down to `Remote Desktop`, and toggle `Enable Remote Desktop` on, and `Confirm`.

![](kvm/31.png)

At this point you will need to restart and you have completed your setup.

Rather than restart you can go right ahead and install other applications like Microsoft Office or Adobe CC that could be used through WinApps.

You may also wish to install the [Spice Guest Tools](https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe) inside the VM which enables features like auto-desktop resize and cut-and-paste when using `virt-manager`. As WinApps uses RDP, this is not necessary if you do not plan to access the machine via `virt-manager`.

Once you are finished, restart the VM, but do not log in. Simply close the VM viewer, and close the Virtual Machine Manager.

## Expert installs

### Define a VM from XML
This expert guide for XML imports is specific to Ubuntu 20.04 and may not work on all hardware platforms.

You can refer to the [KVM](https://www.linux-kvm.org) documentation for specifics, but the first thing you need to do is set up a Virtual Machine running Windows 10 Professional (or any version that supports RDP). First, install KVM:
``` bash
sudo apt-get install -y virt-manager
```
Now, copy your Windows ISO and VirtIO iso (links to download in the main guide) into the folder and update the `kvm/RDPWindows.xml` appropriately.

Next, define a VM called RDPWindows from the sample XML file with:
``` bash
virsh define kvm/RDPWindows.xml
virsh autostart RDPWindows
```
You should then open the VMs properties in `virt-manager` and ensure that under CPU `Copy host CPU configuration` is selected.

Boot it up, install windows, and then [Install the virtual machine](#install-the-virtual-machine).

### Run KVM in user mode
Now set up KVM to run as your user instead of root and allow it through AppArmor (for Ubuntu 20.04 and above):
``` bash
sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf
sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf
sudo usermod -a -G kvm $(id -un)
sudo usermod -a -G libvirt $(id -un)
sudo systemctl restart libvirtd
sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
```
You will likely need to reboot to ensure your current shell is added to the group.





================================================
FILE: install/ExtractPrograms.ps1
================================================

Function Get-Icon {
    <#
        Get-Icon License:

        License

        The MIT License (MIT)

        Copyright (c)

        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    #>
    <#
        .SYNOPSIS
            Gets the icon from a file

        .DESCRIPTION
            Gets the icon from a file and displays it in a variety formats.

        .PARAMETER Path
            The path to a file to get the icon

        .PARAMETER ToBytes
            Displays outputs as a byte array

        .PARAMETER ToBitmap
            Display the icon as a bitmap object

        .PARAMETER ToBase64
            Displays the icon in Base64 encoded format

        .NOTES
            Name: Get-Icon
            Author: Boe Prox
            Version History:
                1.0 //Boe Prox - 11JAN2016
                    - Initial version

        .OUTPUT
            System.Drawing.Icon
            System.Drawing.Bitmap
            System.String
            System.Byte[]

        .EXAMPLE
            Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe'

            FullName : C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe
            Handle   : 164169893
            Height   : 32
            Size     : {Width=32, Height=32}
            Width    : 32

            Description
            -----------
            Returns the System.Drawing.Icon representation of the icon

        .EXAMPLE
            Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap

            Tag                  : 
            PhysicalDimension    : {Width=32, Height=32}
            Size                 : {Width=32, Height=32}
            Width                : 32
            Height               : 32
            HorizontalResolution : 96
            VerticalResolution   : 96
            Flags                : 2
            RawFormat            : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
            PixelFormat          : Format32bppArgb
            Palette              : System.Drawing.Imaging.ColorPalette
            FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
            PropertyIdList       : {}
            PropertyItems        : {}

            Description
            -----------
            Returns the System.Drawing.Bitmap representation of the icon

        .EXAMPLE
            $FileName = 'C:\Temp\PowerShellIcon.png'
            $Format = [System.Drawing.Imaging.ImageFormat]::Png
            (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap).Save($FileName,$Format)

            Description
            -----------
            Saves the icon as a file.

        .EXAMPLE
            Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64

            AAABAAEAICAQHQAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP
            //AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmZmZmZgAAAAAAaId3d3d3d4iIiIdgAA
            AHdmhmZmZmZmZmZmZoZAAAB2ZnZmZmZmZmZmZmZ3YAAAdmZ3ZmiHZniIiHZmaGAAAHZmd2Zv/4eIiIi
            GZmhgAAB2ZmdmZ4/4eIh3ZmZnYAAAd2ZnZmZo//h2ZmZmZ3YAAHZmaGZmZo//h2ZmZmd2AAB3Zmd2Zm
            Znj/h2ZmZmhgAAd3dndmZmZuj/+GZmZoYAAHd3dod3dmZuj/9mZmZ2AACHd3aHd3eIiP/4ZmZmd2AAi
            Hd2iIiIiI//iId2ZndgAIiIhoiIiIj//4iIiIiIYACIiId4iIiP//iIiIiIiGAAiIiIaIiI//+IiIiI
            iIhkAIiIiGiIiP/4iIiIiIiIdgCIiIhoiIj/iIiIiIiIiIYAiIiIeIiIiIiIiIiIiIiGAAiIiIaP///
            ////////4hgAAAAAGZmZmZmZmZmZmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////gA
            AAf4AAAD+AAAAfgAAAHAAAABwAAAAcAAAAHAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAQAAAAEA
            AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAP4AAAH//////////////////////////w==

            Description
            -----------
            Returns the Base64 encoded representation of the icon

        .EXAMPLE
            Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 | Clip

            Description
            -----------
            Returns the Base64 encoded representation of the icon and saves it to the clipboard.

        .EXAMPLE
            (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBytes) -Join ''

            0010103232162900002322002200040000320006400010400000128200000000000000000000000
            0128001280001281280128000128012801281280012812812801921921920002550025500025525
            5025500025502550255255002552552550000000000000000000000000000000000000000000000
            0000000000000000000000000000000000006102102102102102102102102102102960000613611
            9119119119119120136136136118000119102134102102102102102102102102102134640011810
            2118102102102102102102102102102119960011810211910210413510212013613611810210496
            0011810211910211125513513613613613410210496001181021031021031432481201361191021
            0210396001191021031021021042552481181021021021031180011810210410210210214325513
            5102102102103118001191021031181021021031432481181021021021340011911910311810210
            2102232255248102102102134001191191181351191181021101432551021021021180013511911
            8135119119136136255248102102102119960136119118136136136136143255136135118102119
            9601361361341361361361362552551361361361361369601361361351201361361432552481361
            3613613613696013613613610413613625525513613613613613613610001361361361041361362
            5524813613613613613613611801361361361041361362551361361361361361361361340136136
            1361201361361361361361361361361361361340813613613414325525525525525525525525524
            8134000061021021021021021021021021021021020000000000000000000000000000000000000
            0000000000000000000000000000000000000000000025525525525525525525525525525525525
            5224003122400152240072240070007000700070003000300030003000300010001000100010000
            0000000000000000000012800025400125525525525525525525525525525525525525525525525
            5255255255255

            Description
            -----------
            Returns the bytes representation of the icon. -Join was used in this for the sake
            of displaying all of the data.

    #>
    [cmdletbinding(
        DefaultParameterSetName = '__DefaultParameterSetName'
    )]
    Param (
        [parameter(ValueFromPipelineByPropertyName=$True)]
        [ValidateNotNullorEmpty()]
        [string]$Path,
        [parameter(ParameterSetName = 'Bytes')]
        [switch]$ToBytes,
        [parameter(ParameterSetName = 'Bitmap')]
        [switch]$ToBitmap,
        [parameter(ParameterSetName = 'Base64')]
        [switch]$ToBase64
    )
    Begin {
        If ($PSBoundParameters.ContainsKey('Debug')) {
            $DebugPreference = 'Continue'
        }
        Add-Type -AssemblyName System.Drawing
    }
    Process {
        $Path = Convert-Path -Path $Path
        Write-Debug $Path
        If (Test-Path -Path $Path) {
            #$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| 
            $Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| 
            Add-Member -MemberType NoteProperty -Name FullName -Value $Path -PassThru
            If ($PSBoundParameters.ContainsKey('ToBytes')) {
                Write-Verbose "Retrieving bytes"
                $MemoryStream = New-Object System.IO.MemoryStream
                $Icon.save($MemoryStream)
                Write-Debug ($MemoryStream | Out-String)
                $MemoryStream.ToArray()   
                $MemoryStream.Flush()  
                $MemoryStream.Dispose()           
            } ElseIf ($PSBoundParameters.ContainsKey('ToBitmap')) {
                $Icon.ToBitMap()
            } ElseIf ($PSBoundParameters.ContainsKey('ToBase64')) {
                $MemoryStream = New-Object System.IO.MemoryStream
                $Icon.save($MemoryStream)
                Write-Debug ($MemoryStream | Out-String)
                $Bytes = $MemoryStream.ToArray()   
                $MemoryStream.Flush() 
                $MemoryStream.Dispose()
                [convert]::ToBase64String($Bytes)
            }  Else {
                $Icon
            }
        } Else {
            Write-Warning "$Path does not exist!"
            Continue
        }
    }
}

"NAMES=()"
"ICONS=()"
"EXES=()"
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\*" |
    Select-Object -Property "(default)" -Unique |
    Where-Object {$_."(default)" -ne $null} |
    ForEach-Object {
        $Exe = $_."(default)".Trim('"')
        $Name = (Get-Item $Exe).VersionInfo.FileDescription.Trim() -replace "  "," "
        $Icon = Get-Icon -Path $Exe -ToBase64
        #Get-ItemProperty $Exe -Name VersionInfo
        "NAMES+=(""$Name"")"
        "EXES+=(""$Exe"")"
        "ICONS+=(""$Icon"")"
    }



================================================
FILE: install/RDPApps.reg
================================================
Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList]
    "fDisabledAllowList"=dword:00000001

    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]
    "fAllowUnlistedRemotePrograms"=dword:00000001


================================================
FILE: install/inquirer.sh
================================================
#!/usr/bin/env bash

#======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/dist/inquirer.sh ========

# License from: https://github.com/kahkhang/Inquirer.sh/blob/master/LICENSE

# The MIT License (MIT)

# Copyright (c) 2017

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

# store the current set options
OLD_SET=$-
set -e

arrow="$(echo -e '\xe2\x9d\xaf')"
checked="$(echo -e '\xe2\x97\x89')"
unchecked="$(echo -e '\xe2\x97\xaf')"
down_arrow=$(echo -e '\u23f7')
up_arrow=$(echo -e '\u23f6')

black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
bold="$(tput bold)"
normal="$(tput sgr0)"
dim=$'\e[2m'

print() {
  echo "$1"
  tput el
}

join() {
  local IFS=$'\n'
  local _join_list
  eval _join_list=( '"${'${1}'[@]}"' )
  local first=true
  for item in ${_join_list[@]}; do
    if [ "$first" = true ]; then
      printf "%s" "$item"
      first=false
    else
      printf "${2-, }%s" "$item"
    fi
  done
}

function gen_env_from_options() {
  local IFS=$'\n'
  local _indices
  local _env_names
  local _checkbox_selected
  eval _indices=( '"${'${1}'[@]}"' )
  eval _env_names=( '"${'${2}'[@]}"' )

  for i in $(gen_index ${#_env_names[@]}); do
    _checkbox_selected[$i]=false
  done

  for i in ${_indices[@]}; do
    _checkbox_selected[$i]=true
  done

  for i in $(gen_index ${#_env_names[@]}); do
    printf "%s=%s\n" "${_env_names[$i]}" "${_checkbox_selected[$i]}"
  done
}

on_default() {
  true;
}

on_keypress() {
  local OLD_IFS
  local IFS
  local key
  OLD_IFS=$IFS
  local on_up=${1:-on_default}
  local on_down=${2:-on_default}
  local on_space=${3:-on_default}
  local on_enter=${4:-on_default}
  local on_left=${5:-on_default}
  local on_right=${6:-on_default}
  local on_ascii=${7:-on_default}
  local on_backspace=${8:-on_default}
  _break_keypress=false
  while IFS="" read -rsn1 key; do
      case "$key" in
      $'\x1b')
          read -rsn1 key
          if [[ "$key" == "[" ]]; then
              read -rsn1 key
              case "$key" in
              'A') eval $on_up;;
              'B') eval $on_down;;
              'D') eval $on_left;;
              'C') eval $on_right;;
              esac
          fi
          ;;
      ' ') eval $on_space ' ';;
      [a-z0-9A-Z\!\#\$\&\+\,\-\.\/\;\=\?\@\[\]\^\_\{\}\~]) eval $on_ascii $key;;
      $'\x7f') eval $on_backspace $key;;
      '') eval $on_enter $key;;
      esac
      if [ $_break_keypress = true ]; then
        break
      fi
  done
  IFS=$OLD_IFS
}

gen_index() {
  local k=$1
  local l=0
  if [ $k -gt 0 ]; then
    for l in $(seq $k)
    do
       echo "$l-1" | bc
    done
  fi
}

cleanup() {
  # Reset character attributes, make cursor visible, and restore
  # previous screen contents (if possible).
  tput sgr0
  tput cnorm
  stty echo

  # Restore `set e` option to its orignal value
  if [[ $OLD_SET =~ e ]]
  then set -e
  else set +e
  fi
}

control_c() {
  cleanup
  exit $?
}

select_indices() {
  local _select_list
  local _select_indices
  local _select_selected=()
  eval _select_list=( '"${'${1}'[@]}"' )
  eval _select_indices=( '"${'${2}'[@]}"' )
  local _select_var_name=$3
  eval $_select_var_name\=\(\)
  for i in $(gen_index ${#_select_indices[@]}); do
    eval $_select_var_name\+\=\(\""${_select_list[${_select_indices[$i]}]}"\"\)
  done
}

print_checkbox_line_arrow() {
  if [ "${_checkbox_selected[$1]}" = true ]; then
    printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}"
  else
    printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$1]} ${normal}"
  fi
}

print_checkbox_line() {
  if [ "${_checkbox_selected[$1]}" = true ]; then
    printf " ${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}"
  else
    printf " ${normal}${unchecked} ${_checkbox_list[$1]} ${normal}"
  fi
}

# https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html
# http://linuxcommand.org/lc3_adv_tput.php
on_checkbox_input_up2() {
  #remove_checkbox_instructions
  tput cub "$(tput cols)"

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
  tput el

  if [ $_current_index = 0 ]; then
    _current_index=$((${#_checkbox_list[@]}-1))
    tput cud $((${#_checkbox_list[@]}-1))
    tput cub "$(tput cols)"
  else
    _current_index=$((_current_index-1))

    tput cuu1 # Up one line
    tput cub "$(tput cols)" # Back to beginning (does this work?)
    tput el # Clear to end of line
  fi

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
}

on_checkbox_input_up() {
  #remove_checkbox_instructions
  tput cub "$(tput cols)"
  if (( ${_current_row} > 0 )) || (( ${#_checkbox_list[@]} <= 5 )); then
    print_checkbox_line $_current_index
    tput el
    if [ $_current_index = 0 ]; then
      _current_index=$((${#_checkbox_list[@]}-1))
      _current_row=4
      tput cud $((${#_checkbox_list[@]}-1))
      tput cub "$(tput cols)"
    else
      _current_index=$((_current_index-1))
      _current_row=$((_current_row-1))
      tput cuu1
      tput cub "$(tput cols)"
      tput el
    fi
    print_checkbox_line_arrow $_current_index
  else
    if [ $_current_index = 0 ]; then
      _current_index=$((${#_checkbox_list[@]}-1))
      _current_row=4
      tput cuu 1
      tput cub "$(tput cols)"
      tput el
      printf "  ${cyan}${up_arrow}${normal}"
      for I in 4 3 2 1; do
        tput cud1
        tput cub "$(tput cols)"
        tput el
        print_checkbox_line $((_current_index-I))
      done
      tput cud1
      tput cub "$(tput cols)"
      tput el
      print_checkbox_line_arrow $((_current_index))
      tput cud1
      tput cub "$(tput cols)"
      tput el
      printf "  ${dim}${down_arrow}${normal}"
      tput cuu 1
    else
      _current_index=$((_current_index-1))
      tput cud 5
      tput cub "$(tput cols)"
      tput el
      printf "  ${cyan}${down_arrow}${normal}"
      for I in 4 3 2 1; do
        tput cuu1
        tput cub "$(tput cols)"
        tput el
        print_checkbox_line $((_current_index+I))
      done
      tput cuu1
      tput cub "$(tput cols)"
      tput el
      print_checkbox_line_arrow $((_current_index))
      if [ $_current_index = 0 ]; then
        tput cuu1
        tput cub "$(tput cols)"
        tput el
        printf "  ${dim}${up_arrow}${normal}"
        tput cud1
      fi
    fi
  fi
}

on_checkbox_input_down() {
  #remove_checkbox_instructions
  tput cub "$(tput cols)"
  if (( ${_current_row} < 4 )) || (( ${#_checkbox_list[@]} <= 5 )); then
    print_checkbox_line $_current_index
    tput el
    if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
      _current_index=0
      _current_row=0
      tput cuu $((${#_checkbox_list[@]}-1))
      tput cub "$(tput cols)"
    else
      _current_index=$((_current_index+1))
      _current_row=$((_current_row+1))
      tput cud1
      tput cub "$(tput cols)"
      tput el
    fi
    print_checkbox_line_arrow $_current_index
  else
    if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
      _current_index=0
      _current_row=0
      tput cuu 5
      tput cub "$(tput cols)"
      tput el
      printf "  ${dim}${up_arrow}${normal}"
      tput cud1
      tput cub "$(tput cols)"
      tput el
      print_checkbox_line_arrow $((_current_index))
      for I in 1 2 3 4; do
        tput cud1
        tput cub "$(tput cols)"
        tput el
        print_checkbox_line $((_current_index+I))
      done
      tput cud1
      tput cub "$(tput cols)"
      tput el
      printf "  ${cyan}${down_arrow}${normal}"
      tput cuu 5
    else
      _current_index=$((_current_index+1))
      tput cuu 5
      tput cub "$(tput cols)"
      tput el
      printf "  ${cyan}${up_arrow}${normal}"
      for I in 4 3 2 1; do
        tput cud1
        tput cub "$(tput cols)"
        tput el
        print_checkbox_line $((_current_index-I))
      done
      tput cud1
      tput cub "$(tput cols)"
      tput el
      print_checkbox_line_arrow $((_current_index))
      if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
        tput cud1
        tput cub "$(tput cols)"
        tput el
        printf "  ${dim}${down_arrow}${normal}"
        tput cuu1
      fi
    fi
  fi
}

on_checkbox_input_enter() {
  remove_checkbox_instructions
  local OLD_IFS
  OLD_IFS=$IFS
  _checkbox_selected_indices=()
  _checkbox_selected_options=()
  IFS=$'\n'

  for i in $(gen_index ${#_checkbox_list[@]}); do
    if [ "${_checkbox_selected[$i]}" = true ]; then
      _checkbox_selected_indices+=($i)
      _checkbox_selected_options+=("${_checkbox_list[$i]}")
    fi
  done

  if (( ${#_checkbox_list[@]} <= 5 )); then
    tput cud $((${#_checkbox_list[@]}-${_current_index}))
    tput cub "$(tput cols)"
    for i in $(seq $((${#_checkbox_list[@]}+1))); do
      tput el1
      tput el
      tput cuu1
    done
  else
    tput cud $((6-${_current_row}))
    tput cub "$(tput cols)"
    for i in $(seq 8); do
      tput el1
      tput el
      tput cuu1
    done
  fi
  tput cub "$(tput cols)"

  tput cuf $((${#prompt}+3))
  printf "${cyan}$(join _checkbox_selected_options)${normal}"
  tput el

  tput cud1
  tput cub "$(tput cols)"
  tput el

  _break_keypress=true
  IFS=$OLD_IFS
}

on_checkbox_input_space() {
  #remove_checkbox_instructions
  tput cub "$(tput cols)"
  tput el
  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    _checkbox_selected[$_current_index]=false
  else
    _checkbox_selected[$_current_index]=true
  fi

  print_checkbox_line_arrow $_current_index
}

remove_checkbox_instructions() {
  if [ $_first_keystroke = true ]; then
    tput cuu $((${_current_index}+1))
    tput cub "$(tput cols)"
    tput cuf $((${#prompt}+3))
    tput el
    tput cud $((${_current_index}+1))
    _first_keystroke=false
  fi
}

# for vim movements
on_checkbox_input_ascii() {
  local key=$1
  case $key in
    "j" ) on_checkbox_input_down;;
    "k" ) on_checkbox_input_up;;
  esac
}

_checkbox_input() {
  local i
  local j
  prompt=$1
  eval _checkbox_list=( '"${'${2}'[@]}"' )
  _current_index=0
  _current_row=0
  _first_keystroke=true

  trap control_c SIGINT EXIT

  stty -echo
  tput civis

  print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Press <space> to select, <enter> to finalize)${normal}"

  for i in $(gen_index ${#_checkbox_list[@]}); do
    _checkbox_selected[$i]=false
  done

  if [ -n "$3" ]; then
    eval _selected_indices=( '"${'${3}'[@]}"' )
    for i in ${_selected_indices[@]}; do
      _checkbox_selected[$i]=true
    done
  fi

  if (( ${#_checkbox_list[@]} > 5 )); then
    tput cub "$(tput cols)"
    print "  ${dim}${up_arrow}${normal}"
  fi

  for i in $(gen_index ${#_checkbox_list[@]}); do
    tput cub "$(tput cols)"
    if [ $i = 0 ]; then
      print_checkbox_line_arrow $i
    else
      print_checkbox_line $i
    fi
    print ""
    tput el
    if (( $i > 3 )) && (( ${#_checkbox_list[@]} > 5 )); then
      print "  ${cyan}${down_arrow}${normal}"
      break
    fi
  done

  for j in $(gen_index ${#_checkbox_list[@]}); do
    tput cuu1
    if (( $j > 4 )); then
      break
    fi
  done

  on_keypress on_checkbox_input_up on_checkbox_input_down on_checkbox_input_space on_checkbox_input_enter on_default on_default on_checkbox_input_ascii
}

checkbox_input() {
  _checkbox_input "$1" "$2"
  _checkbox_input_output_var_name=$3
  select_indices _checkbox_list _checkbox_selected_indices $_checkbox_input_output_var_name

  unset _checkbox_list
  unset _break_keypress
  unset _first_keystroke
  unset _current_index
  unset _checkbox_input_output_var_name
  unset _checkbox_selected_indices
  unset _checkbox_selected_options

  cleanup
}

checkbox_input_indices() {
  _checkbox_input "$1" "$2" "$3"
  _checkbox_input_output_var_name=$3

  eval $_checkbox_input_output_var_name\=\(\)
  for i in $(gen_index ${#_checkbox_selected_indices[@]}); do
    eval $_checkbox_input_output_var_name\+\=\(${_checkbox_selected_indices[$i]}\)
  done

  unset _checkbox_list
  unset _break_keypress
  unset _first_keystroke
  unset _current_index
  unset _checkbox_input_output_var_name
  unset _checkbox_selected_indices
  unset _checkbox_selected_options

  cleanup
}




on_list_input_up() {
  remove_list_instructions
  tput cub "$(tput cols)"

  printf "  ${_list_options[$_list_selected_index]}"
  tput el

  if [ $_list_selected_index = 0 ]; then
    _list_selected_index=$((${#_list_options[@]}-1))
    tput cud $((${#_list_options[@]}-1))
    tput cub "$(tput cols)"
  else
    _list_selected_index=$((_list_selected_index-1))

    tput cuu1
    tput cub "$(tput cols)"
    tput el
  fi

  printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}

on_list_input_down() {
  remove_list_instructions
  tput cub "$(tput cols)"

  printf "  ${_list_options[$_list_selected_index]}"
  tput el

  if [ $_list_selected_index = $((${#_list_options[@]}-1)) ]; then
    _list_selected_index=0
    tput cuu $((${#_list_options[@]}-1))
    tput cub "$(tput cols)"
  else
    _list_selected_index=$((_list_selected_index+1))
    tput cud1
    tput cub "$(tput cols)"
    tput el
  fi
  printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}

on_list_input_enter_space() {
  local OLD_IFS
  OLD_IFS=$IFS
  IFS=$'\n'

  tput cud $((${#_list_options[@]}-${_list_selected_index}))
  tput cub "$(tput cols)"

  for i in $(seq $((${#_list_options[@]}+1))); do
    tput el1
    tput el
    tput cuu1
  done
  tput cub "$(tput cols)"

  tput cuf $((${#prompt}+3))
  printf "${cyan}${_list_options[$_list_selected_index]}${normal}"
  tput el

  tput cud1
  tput cub "$(tput cols)"
  tput el

  _break_keypress=true
  IFS=$OLD_IFS
}

remove_list_instructions() {
  if [ $_first_keystroke = true ]; then
    tput cuu $((${_list_selected_index}+1))
    tput cub "$(tput cols)"
    tput cuf $((${#prompt}+3))
    tput el
    tput cud $((${_list_selected_index}+1))
    _first_keystroke=false
  fi
}

_list_input() {
  local i
  local j
  prompt=$1
  eval _list_options=( '"${'${2}'[@]}"' )

  _list_selected_index=0
  _first_keystroke=true

  trap control_c SIGINT EXIT

  stty -echo
  tput civis

  print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Use arrow keys)${normal}"

  for i in $(gen_index ${#_list_options[@]}); do
    tput cub "$(tput cols)"
    if [ $i = 0 ]; then
      print "${cyan}${arrow} ${_list_options[$i]} ${normal}"
    else
      print "  ${_list_options[$i]}"
    fi
    tput el
  done

  for j in $(gen_index ${#_list_options[@]}); do
    tput cuu1
  done

  on_keypress on_list_input_up on_list_input_down on_list_input_enter_space on_list_input_enter_space

}


list_input() {
  _list_input "$1" "$2"
  local var_name=$3
  eval $var_name=\'"${_list_options[$_list_selected_index]}"\'
  unset _list_selected_index
  unset _list_options
  unset _break_keypress
  unset _first_keystroke

  cleanup
}

list_input_index() {
  _list_input "$1" "$2"
  local var_name=$3
  eval $var_name=\'"$_list_selected_index"\'
  unset _list_selected_index
  unset _list_options
  unset _break_keypress
  unset _first_keystroke

  cleanup
}




on_text_input_left() {
  remove_regex_failed
  if [ $_current_pos -gt 0 ]; then
    tput cub1
    _current_pos=$(($_current_pos-1))
  fi
}

on_text_input_right() {
  remove_regex_failed
  if [ $_current_pos -lt ${#_text_input} ]; then
    tput cuf1
    _current_pos=$(($_current_pos+1))
  fi
}

on_text_input_enter() {
  remove_regex_failed

  if [[ "$_text_input" =~ $_text_input_regex && "$(eval $_text_input_validator "$_text_input")" = true ]]; then
    tput cub "$(tput cols)"
    tput cuf $((${#_read_prompt}-19))
    printf "${cyan}${_text_input}${normal}"
    tput el
    tput cud1
    tput cub "$(tput cols)"
    tput el
    eval $var_name=\'"${_text_input}"\'
    _break_keypress=true
  else
    _text_input_regex_failed=true
    tput civis
    tput cud1
    tput cub "$(tput cols)"
    tput el
    printf "${red}>>${normal} $_text_input_regex_failed_msg"
    tput cuu1
    tput cub "$(tput cols)"
    tput cuf $((${#_read_prompt}-19))
    tput el
    _text_input=""
    _current_pos=0
    tput cnorm
  fi
}

on_text_input_ascii() {
  remove_regex_failed
  local c=$1

  if [ "$c" = '' ]; then
    c=' '
  fi

  local rest="${_text_input:$_current_pos}"
  _text_input="${_text_input:0:$_current_pos}$c$rest"
  _current_pos=$(($_current_pos+1))

  tput civis
  printf "$c$rest"
  tput el
  if [ ${#rest} -gt 0 ]; then
    tput cub ${#rest}
  fi
  tput cnorm
}

on_text_input_backspace() {
  remove_regex_failed
  if [ $_current_pos -gt 0 ]; then
    local start="${_text_input:0:$(($_current_pos-1))}"
    local rest="${_text_input:$_current_pos}"
    _current_pos=$(($_current_pos-1))
    tput cub 1
    tput el
    tput sc
    printf "$rest"
    tput rc
    _text_input="$start$rest"
  fi
}

remove_regex_failed() {
  if [ $_text_input_regex_failed = true ]; then
    _text_input_regex_failed=false
    tput sc
    tput cud1
    tput el1
    tput el
    tput rc
  fi
}

text_input_default_validator() {
  echo true;
}

text_input() {
  local prompt=$1
  local var_name=$2
  local _text_input_regex="${3:-"\.+"}"
  local _text_input_regex_failed_msg=${4:-"Input validation failed"}
  local _text_input_validator=${5:-text_input_default_validator}
  local _read_prompt_start=$'\e[32m?\e[39m\e[1m'
  local _read_prompt_end=$'\e[22m'
  local _read_prompt="$( echo "$_read_prompt_start ${prompt} $_read_prompt_end")"
  local _current_pos=0
  local _text_input_regex_failed=false
  local _text_input=""
  printf "$_read_prompt"


  trap control_c SIGINT EXIT

  stty -echo
  tput cnorm

  on_keypress on_default on_default on_text_input_ascii on_text_input_enter on_text_input_left on_text_input_right on_text_input_ascii on_text_input_backspace
  eval $var_name=\'"${_text_input}"\'

  cleanup
}

# =============================================================

function menuFromCmd() {
	local mLOCALRESULT=$1
	local mRESULT=''
	read -r -a ARRAY <<< $3
	list_input "$2" ARRAY mRESULT
	eval $mLOCALRESULT="'$mRESULT'"
}

function menuFromArr() {
	local mLOCALRESULT=$1
	shift
	local PROMPT=$1
	shift
	local ARRAY=("$@")
	list_input "$PROMPT" ARRAY mRESULT
	eval $mLOCALRESULT="'$mRESULT'"
}

function multiFromArr() {
	local mLOCALRESULT=$1
	shift
	local PROMPT=$1
	shift
	local ARRAY=("$@")
	checkbox_input "$PROMPT" ARRAY mRESULT
	eval $mLOCALRESULT="'$mRESULT'"
}


================================================
FILE: installer.sh
================================================
#!/usr/bin/env bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

MAKEDEMO=0
USEDEMO=0

. "${DIR}/install/inquirer.sh"

INSTALLED_EXES=()

function waUsage() {
	echo 'Usage:
  ./installer.sh --user    # Install everything in ${HOME}
  ./installer.sh --system  # Install everything in /usr'
	exit
}

function waNoSudo() {
	echo 'You are attempting to switch from a --system install to a --user install.
Please run "./installer.sh --system --uninstall" first.'
	exit
}

function waInstall() {
	${SUDO} mkdir -p "${SYS_PATH}/apps"
	. "${DIR}/bin/winapps" install
}

function waFindInstalled() {
	echo -n "  Checking for installed apps in RDP machine (this may take a while)..."
	if [ $USEDEMO != 1 ]; then
		rm -f ${HOME}/.local/share/winapps/installed.bat
		rm -f ${HOME}/.local/share/winapps/installed.tmp
		rm -f ${HOME}/.local/share/winapps/installed
		rm -f ${HOME}/.local/share/winapps/detected
		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 &
		COUNT=0
		while [ ! -f "${HOME}/.local/share/winapps/installed" ]; do
			sleep 5
			COUNT=$((COUNT + 1))
			if (( COUNT == 15 )); then
				echo " Finished."
				echo ""
				echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:"
				echo "  bin/winapps check"
				echo ""
				echo "If it cannot connect, this is most likely due to:"
				echo "  - You need to accept the security cert the first time you connect (with 'check')"
				echo "  - Not enabling RDP in the Windows VM"
				echo "  - Not being able to connect to the IP of the VM"
				echo "  - Incorrect user credentials in winapps.conf"
				echo "  - Not merging install/RDPApps.reg into the VM"
				exit
			fi
		done
		if [ $MAKEDEMO = 1 ]; then
			rm -rf /tmp/winapps_demo
			cp -a ${HOME}/.local/share/winapps /tmp/winapps_demo
			exit
		fi
	else
		rm -rf ${HOME}/.local/share/winapps
		cp -a /tmp/winapps_demo ${HOME}/.local/share/winapps
		#sleep 3
	fi
	echo " Finished."
}

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]
Name=${NAME}
Exec=${BIN_PATH}/winapps ${1} %F
Terminal=false
Type=Application
Icon=${SYS_PATH}/apps/${1}/icon.${2}
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
${BIN_PATH}/winapps ${1} $@
" |${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
		. "${DIR}/apps/${F}/info"
		APPS+=("${FULL_NAME} (${F})")
		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 [ "${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"
		for F in "${SELECTED_APPS[@]}"; do
			APP="${F##*(}"
			APP="${APP%%)}"
			echo "${APP}" >> "${HOME}/.local/share/winapps/installed"
		done
	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
			COUNT=$((COUNT + 1))
			${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps"
			waConfigureApp "${F}" svg
		done
	fi
	rm -f "${HOME}/.local/share/winapps/installed"
	rm -f "${HOME}/.local/share/winapps/installed.bat"
	if (( $COUNT == 0 )); then
		echo "  No configured applications."
	fi
}

function waConfigureDetectedApps() {
	if [ -f "${HOME}/.local/share/winapps/detected" ]; then
		sed -i 's/\r//g' "${HOME}/.local/share/winapps/detected"
		. "${HOME}/.local/share/winapps/detected"
		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
				APPS+=("${NAMES[$I]} (${EXE})")
			fi
		done
		IFS=$'\n' APPS=($(sort <<<"${APPS[*]}"))
		unset IFS
		OPTIONS=("Set up all detected applications" "Select which applications to set up" "Do not set up any applications")
		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"
			for F in "${SELECTED_APPS[@]}"; do
				EXE="${F##*(}"
				EXE="${EXE%%)}"
				APP="${F% (*}"
				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"
			done
		fi
		COUNT=0
		if [ -f "${HOME}/.local/share/winapps/installed" ]; then
			while read LINE; do
				EXE="${LINE%|*}"
				NAME="${LINE#*|}"
				for I in "${!NAMES[@]}"; do
					if [ "${NAME}" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\${EXE}" ]]; then
						EXE=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]')
						${SUDO} mkdir -p "${SYS_PATH}/apps/${EXE}"
						echo "# GNOME shortcut name
NAME=\"${NAME}\"

# Used for descriptions and window class
FULL_NAME=\"${NAME}\"

# The executable inside windows
WIN_EXECUTABLE=\"${EXES[$I]}\"

# GNOME categories
CATEGORIES=\"WinApps\"

# GNOME mimetypes
MIME_TYPES=\"\"
" > "${SYS_PATH}/apps/${EXE}/info"
						echo "${ICONS[$I]}" | base64 -d > "${SYS_PATH}/apps/${EXE}/icon.ico"
						waConfigureApp "${EXE}" ico
						COUNT=$((COUNT + 1))
					fi
				done
			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
			echo "  No configured applications."
		fi
	fi
}


function waConfigureWindows() {
	echo -n "  Configuring Windows..."
	if [ ${USEDEMO} != 1 ]; then
		${SUDO} rm -f "${APP_PATH}/windows.desktop"
		${SUDO} mkdir -p "${SYS_PATH}/icons"
		${SUDO} cp "${DIR}/icons/windows.svg" "${SYS_PATH}/icons/windows.svg"
		echo "[Desktop Entry]
Name=Windows
Exec=${BIN_PATH}/winapps windows %F
Terminal=false
Type=Application
Icon=${SYS_PATH}/icons/windows.svg
StartupWMClass=Micorosoft Windows
Comment=Micorosoft Windows
Categories=Windows
" |${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} chmod a+x "${BIN_PATH}/windows"
	fi
	echo " Finished."
}

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
		echo -n "  Removing ${F}..."
		${SUDO} rm ${F}
		echo " Finished."
	done
	for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"*); do
		echo -n "  Removing ${F}..."
		${SUDO} rm ${F}
		echo " Finished."
	done
}

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
		if [ -z "${SUDO}" ]; then
			waNoSudo
		fi
		echo -n "  Removing ${F}..."
		${SUDO} rm ${F}
		echo " Finished."
	done
	for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"*); do
		if [ -z "${SUDO}" ]; then
			waNoSudo
		fi
		echo -n "  Removing ${F}..."
		${SUDO} rm ${F}
		echo " Finished."
	done
}

if [ -z "${1}" ]; then
	OPTIONS=(User System)
	menuFromArr INSTALL_TYPE "Would you like to install for the current user or the whole system?" "${OPTIONS[@]}"
elif [ "${1}" = '--user' ]; then
	INSTALL_TYPE='User'
elif [ "${1}" = '--system' ]; then
	INSTALL_TYPE='System'
else
	waUsage
fi

if [ "${INSTALL_TYPE}" = 'User' ]; then
	SUDO=""
	BIN_PATH="${HOME}/.local/bin"
	APP_PATH="${HOME}/.local/share/applications"
	SYS_PATH="${HOME}/.local/share/winapps"
	if [ -n "${2}" ]; then
		if [ "${2}" = '--uninstall' ]; then
			# Uninstall
			echo "Uninstalling..."
			waUninstallUser
			exit
		else
			usage
		fi
	fi
elif [ "${INSTALL_TYPE}" = 'System' ]; then
	SUDO="sudo"
	sudo ls > /dev/null
	BIN_PATH="/usr/local/bin"
	APP_PATH="/usr/share/applications"
	SYS_PATH="/usr/local/share/winapps"
	if [ -n "${2}" ]; then
		if [ "${2}" = '--uninstall' ]; then
			# Uninstall
			echo "Uninstalling..."
			waUninstallSystem
			exit
		else
			usage
		fi
	fi
fi

echo "Removing any old configurations..."
waUninstallUser
waUninstallSystem

echo "Installing..."

# Inititialize
waInstall

# Check for installed apps
waFindInstalled

# Install windows
waConfigureWindows

# Configure apps
waConfigureApps
waConfigureDetectedApps

echo "Installation complete."

================================================
FILE: kvm/RDPWindows.xml
================================================
<domain type='kvm' id='9'>
  <name>RDPWindows</name>
  <uuid>50f121b4-93e7-46b5-b302-902d022dfa9c</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>1298432</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <vmport state='off'/>
  </features>
  <cpu mode='custom' match='exact' check='full'>
    <model fallback='forbid'>Haswell-noTSX-IBRS</model>
    <vendor>Intel</vendor>
    <feature policy='require' name='vme'/>
    <feature policy='require' name='ss'/>
    <feature policy='require' name='vmx'/>
    <feature policy='require' name='f16c'/>
    <feature policy='require' name='rdrand'/>
    <feature policy='require' name='hypervisor'/>
    <feature policy='require' name='arat'/>
    <feature policy='require' name='tsc_adjust'/>
    <feature policy='require' name='umip'/>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='stibp'/>
    <feature policy='require' name='arch-capabilities'/>
    <feature policy='require' name='ssbd'/>
    <feature policy='require' name='xsaveopt'/>
    <feature policy='require' name='pdpe1gb'/>
    <feature policy='require' name='abm'/>
    <feature policy='require' name='ibpb'/>
    <feature policy='require' name='amd-stibp'/>
    <feature policy='require' name='amd-ssbd'/>
    <feature policy='require' name='skip-l1dfl-vmentry'/>
    <feature policy='require' name='pschange-mc-no'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='hpet' present='yes'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='./Win10_2004_English_x64.iso' index='3'/>
      <backingStore/>
      <target dev='sdb' bus='sata'/>
      <readonly/>
      <boot order='2'/>
      <alias name='sata0-0-1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='./virtio-win-0.1.185.iso' index='2'/>
      <backingStore/>
      <target dev='sdc' bus='sata'/>
      <readonly/>
      <alias name='sata0-0-2'/>
      <address type='drive' controller='0' bus='0' target='0' unit='2'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='./RDPWindows.qcow2' index='1'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='sata' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'>
      <alias name='pcie.0'/>
    </controller>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <alias name='pci.1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <alias name='pci.2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <alias name='pci.3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <alias name='pci.4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <alias name='pci.5'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x15'/>
      <alias name='pci.6'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <alias name='virtio-serial0'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:40:9c:f6'/>
      <source network='default' portid='1b8151f7-ddce-4dcc-99cb-55c80590fde7' bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/8'/>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/8'>
      <source path='/dev/pts/8'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0' state='connected'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'>
      <alias name='input1'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input2'/>
    </input>
    <graphics type='spice' port='5900' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
      <image compression='off'/>
    </graphics>
    <sound model='ich9'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir0'/>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <alias name='redir1'/>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+385601105:+385600513</label>
    <imagelabel>+385601105:+385600513</imagelabel>
  </seclabel>
</domain>

Download .txt
gitextract_bxio7kfp/

├── README.md
├── apps/
│   ├── access/
│   │   └── info
│   ├── access-o365/
│   │   └── info
│   ├── access-o365-x86/
│   │   └── info
│   ├── access-x86/
│   │   └── info
│   ├── acrobat-reader-dc/
│   │   └── info
│   ├── acrobat-x-pro/
│   │   └── info
│   ├── adobe-cc/
│   │   └── info
│   ├── aftereffects-cc/
│   │   └── info
│   ├── audition-cc/
│   │   └── info
│   ├── bridge-cc/
│   │   └── info
│   ├── bridge-cs6/
│   │   └── info
│   ├── bridge-cs6-x86/
│   │   └── info
│   ├── cmd/
│   │   └── info
│   ├── excel/
│   │   └── info
│   ├── excel-o365/
│   │   └── info
│   ├── excel-o365-x86/
│   │   └── info
│   ├── excel-x86/
│   │   └── info
│   ├── explorer/
│   │   └── info
│   ├── iexplorer/
│   │   └── info
│   ├── illustrator-cc/
│   │   └── info
│   ├── indesign-cc/
│   │   └── info
│   ├── lightroom-cc/
│   │   └── info
│   ├── onenote/
│   │   └── info
│   ├── onenote-o365/
│   │   └── info
│   ├── onenote-o365-x86/
│   │   └── info
│   ├── onenote-x86/
│   │   └── info
│   ├── outlook/
│   │   └── info
│   ├── outlook-o365/
│   │   └── info
│   ├── outlook-o365-x86/
│   │   └── info
│   ├── outlook-x86/
│   │   └── info
│   ├── photoshop-cc/
│   │   └── info
│   ├── photoshop-cs6/
│   │   └── info
│   ├── photoshop-cs6-x86/
│   │   └── info
│   ├── powerpoint/
│   │   └── info
│   ├── powerpoint-o365/
│   │   └── info
│   ├── powerpoint-o365-x86/
│   │   └── info
│   ├── powerpoint-x86/
│   │   └── info
│   ├── powershell/
│   │   └── info
│   ├── powershell-core/
│   │   └── info
│   ├── premiere-pro-cc/
│   │   └── info
│   ├── project/
│   │   └── info
│   ├── project-o365/
│   │   └── info
│   ├── project-o365-x86/
│   │   └── info
│   ├── project-x86/
│   │   └── info
│   ├── publisher/
│   │   └── info
│   ├── publisher-o365/
│   │   └── info
│   ├── publisher-o365-x86/
│   │   └── info
│   ├── publisher-x86/
│   │   └── info
│   ├── vs-community-2019/
│   │   └── info
│   ├── vs-enterprise-2019/
│   │   └── info
│   ├── vs-professional-2019/
│   │   └── info
│   ├── word/
│   │   └── info
│   ├── word-o365/
│   │   └── info
│   ├── word-o365-x86/
│   │   └── info
│   └── word-x86/
│       └── info
├── bin/
│   └── winapps
├── docs/
│   └── KVM.md
├── install/
│   ├── ExtractPrograms.ps1
│   ├── RDPApps.reg
│   └── inquirer.sh
├── installer.sh
└── kvm/
    ├── RDPWindows.qcow2
    └── RDPWindows.xml
Condensed preview — 64 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (97K chars).
[
  {
    "path": "README.md",
    "chars": 4637,
    "preview": "# WinApps for Linux\n\nRun Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they w"
  },
  {
    "path": "apps/access/info",
    "chars": 322,
    "preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
  },
  {
    "path": "apps/access-o365/info",
    "chars": 317,
    "preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
  },
  {
    "path": "apps/access-o365-x86/info",
    "chars": 323,
    "preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
  },
  {
    "path": "apps/access-x86/info",
    "chars": 328,
    "preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
  },
  {
    "path": "apps/acrobat-reader-dc/info",
    "chars": 336,
    "preview": "# GNOME shortcut name\nNAME=\"Acrobat Reader DC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Acrobat Reader DC\"\n\n"
  },
  {
    "path": "apps/acrobat-x-pro/info",
    "chars": 323,
    "preview": "# GNOME shortcut name\nNAME=\"Acrobat X Pro\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Acrobat X Pro\"\n\n# The ex"
  },
  {
    "path": "apps/adobe-cc/info",
    "chars": 316,
    "preview": "# GNOME shortcut name\nNAME=\"Creative Cloud\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Creative Cloud\"\n\n"
  },
  {
    "path": "apps/aftereffects-cc/info",
    "chars": 414,
    "preview": "# GNOME shortcut name\nNAME=\"After Effects CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe After Effects C"
  },
  {
    "path": "apps/audition-cc/info",
    "chars": 305,
    "preview": "# GNOME shortcut name\nNAME=\"Audition CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Audition CC\"\n\n# The "
  },
  {
    "path": "apps/bridge-cc/info",
    "chars": 327,
    "preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
  },
  {
    "path": "apps/bridge-cs6/info",
    "chars": 319,
    "preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
  },
  {
    "path": "apps/bridge-cs6-x86/info",
    "chars": 324,
    "preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
  },
  {
    "path": "apps/cmd/info",
    "chars": 262,
    "preview": "# GNOME shortcut name\nNAME=\"Cmd\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Command Prompt\"\n\n# The executable "
  },
  {
    "path": "apps/excel/info",
    "chars": 647,
    "preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
  },
  {
    "path": "apps/excel-o365/info",
    "chars": 652,
    "preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
  },
  {
    "path": "apps/excel-o365-x86/info",
    "chars": 658,
    "preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
  },
  {
    "path": "apps/excel-x86/info",
    "chars": 653,
    "preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
  },
  {
    "path": "apps/explorer/info",
    "chars": 267,
    "preview": "# GNOME shortcut name\nNAME=\"Explorer\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Explorer\"\n\n# The ex"
  },
  {
    "path": "apps/iexplorer/info",
    "chars": 551,
    "preview": "# GNOME shortcut name\nNAME=\"Internet Explorer\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Internet Explorer\"\n\n"
  },
  {
    "path": "apps/illustrator-cc/info",
    "chars": 366,
    "preview": "# GNOME shortcut name\nNAME=\"Illustrator CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Illustrator CC\"\n\n"
  },
  {
    "path": "apps/indesign-cc/info",
    "chars": 369,
    "preview": "# GNOME shortcut name\nNAME=\"InDesign CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe InDesign CC\"\n\n# The "
  },
  {
    "path": "apps/lightroom-cc/info",
    "chars": 301,
    "preview": "# GNOME shortcut name\nNAME=\"Lightroom CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Lightroom CC\"\n\n# Th"
  },
  {
    "path": "apps/onenote/info",
    "chars": 317,
    "preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
  },
  {
    "path": "apps/onenote-o365/info",
    "chars": 322,
    "preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
  },
  {
    "path": "apps/onenote-o365-x86/info",
    "chars": 328,
    "preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
  },
  {
    "path": "apps/onenote-x86/info",
    "chars": 323,
    "preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
  },
  {
    "path": "apps/outlook/info",
    "chars": 347,
    "preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
  },
  {
    "path": "apps/outlook-o365/info",
    "chars": 352,
    "preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
  },
  {
    "path": "apps/outlook-o365-x86/info",
    "chars": 358,
    "preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
  },
  {
    "path": "apps/outlook-x86/info",
    "chars": 353,
    "preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
  },
  {
    "path": "apps/photoshop-cc/info",
    "chars": 329,
    "preview": "# GNOME shortcut name\nNAME=\"Photoshop CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CC\"\n\n# Th"
  },
  {
    "path": "apps/photoshop-cs6/info",
    "chars": 339,
    "preview": "# GNOME shortcut name\nNAME=\"Photoshop CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CS6\"\n\n# "
  },
  {
    "path": "apps/photoshop-cs6-x86/info",
    "chars": 336,
    "preview": "# GNOME shortcut name\nNAME=\"Photoshop CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CS6\"\n\n# "
  },
  {
    "path": "apps/powerpoint/info",
    "chars": 769,
    "preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
  },
  {
    "path": "apps/powerpoint-o365/info",
    "chars": 774,
    "preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
  },
  {
    "path": "apps/powerpoint-o365-x86/info",
    "chars": 780,
    "preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
  },
  {
    "path": "apps/powerpoint-x86/info",
    "chars": 775,
    "preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
  },
  {
    "path": "apps/powershell/info",
    "chars": 305,
    "preview": "# GNOME shortcut name\nNAME=\"Powershell\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Powershell\"\n\n# Th"
  },
  {
    "path": "apps/powershell-core/info",
    "chars": 296,
    "preview": "# GNOME shortcut name\nNAME=\"Powershell Core\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Powershell C"
  },
  {
    "path": "apps/premiere-pro-cc/info",
    "chars": 346,
    "preview": "# GNOME shortcut name\nNAME=\"Premiere Pro CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Premiere Pro CC\""
  },
  {
    "path": "apps/project/info",
    "chars": 412,
    "preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
  },
  {
    "path": "apps/project-o365/info",
    "chars": 417,
    "preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
  },
  {
    "path": "apps/project-o365-x86/info",
    "chars": 423,
    "preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
  },
  {
    "path": "apps/project-x86/info",
    "chars": 418,
    "preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
  },
  {
    "path": "apps/publisher/info",
    "chars": 326,
    "preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
  },
  {
    "path": "apps/publisher-o365/info",
    "chars": 331,
    "preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
  },
  {
    "path": "apps/publisher-o365-x86/info",
    "chars": 337,
    "preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
  },
  {
    "path": "apps/publisher-x86/info",
    "chars": 332,
    "preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
  },
  {
    "path": "apps/vs-community-2019/info",
    "chars": 495,
    "preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Community\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual St"
  },
  {
    "path": "apps/vs-enterprise-2019/info",
    "chars": 498,
    "preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Enterprise\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual S"
  },
  {
    "path": "apps/vs-professional-2019/info",
    "chars": 504,
    "preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Professional\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual"
  },
  {
    "path": "apps/word/info",
    "chars": 550,
    "preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
  },
  {
    "path": "apps/word-o365/info",
    "chars": 555,
    "preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
  },
  {
    "path": "apps/word-o365-x86/info",
    "chars": 561,
    "preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
  },
  {
    "path": "apps/word-x86/info",
    "chars": 556,
    "preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
  },
  {
    "path": "bin/winapps",
    "chars": 3912,
    "preview": "#!/usr/bin/env bash\n\nif [ ! -f \"${HOME}/.config/winapps/winapps.conf\" ] && [ ! -f \"${HOME}/.winapps\" ]; then\n\techo \"You "
  },
  {
    "path": "docs/KVM.md",
    "chars": 8438,
    "preview": "# Creating a Virtual Machine in KVM\n\nLatest documentation available at: https://nowsci.com/#/winapps/kvm/?id=creating-a-"
  },
  {
    "path": "install/ExtractPrograms.ps1",
    "chars": 10072,
    "preview": "\nFunction Get-Icon {\n    <#\n        Get-Icon License:\n\n        License\n\n        The MIT License (MIT)\n\n        Copyright"
  },
  {
    "path": "install/RDPApps.reg",
    "chars": 312,
    "preview": "Windows Registry Editor Version 5.00\n\n    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Terminal Serv"
  },
  {
    "path": "install/inquirer.sh",
    "chars": 19846,
    "preview": "#!/usr/bin/env bash\n\n#======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/di"
  },
  {
    "path": "installer.sh",
    "chars": 10320,
    "preview": "#!/usr/bin/env bash\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\n\nMAKEDEMO=0\nUSEDEMO=0\n\n. \"$"
  },
  {
    "path": "kvm/RDPWindows.xml",
    "chars": 7931,
    "preview": "<domain type='kvm' id='9'>\n  <name>RDPWindows</name>\n  <uuid>50f121b4-93e7-46b5-b302-902d022dfa9c</uuid>\n  <metadata>\n  "
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the Fmstrat/winapps GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 64 files (86.5 KB), approximately 27.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!